pascalabcnet/InstallerSamples/!MainFeatures/06_Classes/OperatorOverloading.pas
2025-10-12 22:21:43 +03:00

82 lines
2.1 KiB
ObjectPascal

// Перегрузка операций
type
Frac = record
private
num,denom: integer;
public
constructor (n,d: integer);
begin
num := n;
denom := d;
end;
class function operator+(a,b: Frac): Frac;
begin
Result := new Frac(a.num*b.denom+b.num*a.denom,a.denom*b.denom);
end;
class function operator-(a,b: Frac): Frac;
begin
Result := new Frac(a.num*b.denom-b.num*a.denom,a.denom*b.denom);
end;
class function operator*(a,b: Frac): Frac;
begin
Result := new Frac(a.num*b.num,a.denom*b.denom);
end;
class function operator/(a,b: Frac): Frac;
begin
Result := new Frac(a.num*b.denom,a.denom*b.num);
end;
class function operator=(a,b: Frac): boolean;
begin
Result := (a.num = b.num) and (a.denom = b.denom);
end;
class function operator<>(a,b: Frac): boolean;
begin
Result := not (a=b);
end;
class function operator<(a,b: Frac): boolean;
begin
Result := a.num/real(a.denom)<b.num/real(b.denom);
end;
class function operator<=(a,b: Frac): boolean;
begin
Result := a.num/real(a.denom)<=b.num/real(b.denom);
end;
class function operator>(a,b: Frac): boolean;
begin
Result := a.num/real(a.denom)>b.num/real(b.denom);
end;
class function operator>=(a,b: Frac): boolean;
begin
Result := a.num/real(a.denom)>=b.num/real(b.denom);
end;
class procedure operator+=(var a: Frac; b: Frac);
begin
a := a + b;
end;
class function operator-(a: Frac): Frac;
begin
Result := new Frac(-a.num,a.denom);
end;
class function operator+(a: Frac): Frac;
begin
Result := a;
end;
function ToString: string; override;
begin
Result := Format('{0}/{1}',num,denom);
end;
end;
var
f := new Frac(1,2);
f1 := new Frac(3,5);
begin
Println($'{f} + {f1} = {f+f1}');
Println($'{f} - {f1} = {f-f1}');
Println($'{f} * {f1} = {f*f1}');
Println($'{f} / {f1} = {f/f1}');
Println(f1 = f);
f += f1;
Println(-f);
end.