Unit Breuken;

INTERFACE

type
  breuk = record { fraction }
    teller,noemer : integer; { numerator,denominator }
  end;

function maak(a,b : integer) : breuk; { make }
function afdruk(f : breuk) : string; { print }
function plus(a,b : breuk) : breuk; { addition }
function minus(a,b : breuk) : breuk; { substraction }
function maal(a,b : breuk) : breuk; { multiplication }
function deel(a,b : breuk) : breuk; { division }
function gelijk(a,b : breuk) : boolean; { equality }
function groter(a,b : breuk) : boolean; { greater }
function dubbel(a : breuk) : double; { Double precision }

IMPLEMENTATION

function maak(a,b : integer) : breuk;
{
  Make
}
var
  h : breuk;
begin
  h.teller := a;
  h.noemer := b;
  maak := h;
end;

function Letterlijk(nr : integer) : string;
{
  Number -> string
}
const
  cijfer : string = '0123456789';
var
  no,t,tel,wel : integer;
  vgl : string;
  c : char;
begin
  no := nr;
  tel := 0;
  vgl := '';
  while no > 0 do
  begin
    c := cijfer[(no mod 10) + 1];
    vgl := vgl + c;
    no := no div 10;
    tel := tel + 1;
  end;
  wel := tel div 2;
  for t := 0 to wel-1 do
  begin
    c := vgl[t+1];
    vgl[t+1] := vgl[tel-t];
    vgl[tel-t] := c;
  end;
  if vgl = '' then vgl := '0';
  Letterlijk := vgl;
end;

function afdruk(f : breuk) : string;
{
  Print
}
begin
  afdruk := Letterlijk(f.teller) + '/' + Letterlijk(f.noemer);
end;

function GGD(aa,bb : integer) : integer;
{
  Greatest Common Divisor
  with Euclid's Algorithm
}
var
  a,b,uit : integer;
begin
  a := aa; b := bb;
  if b = 0 then uit := a
    else uit := GGD(b,a mod b);
  GGD := uit;
end;

function vereenvoudig(f : breuk) : breuk;
{
  Simplify
}
var
  h : breuk;
  deler : integer;
begin 
  h := f;
  deler := GGD(h.teller,h.noemer);
  h.teller := h.teller div deler; 
  h.noemer := h.noemer div deler; 
  vereenvoudig := h;
end;

function plus(a,b : breuk) : breuk;
{
  a + b
}
var
  h : breuk;
begin
  h.noemer := a.noemer * b.noemer;
  h.teller := a.teller * b.noemer + b.teller * a.noemer;
  plus := vereenvoudig(h);
end;

function minus(a,b : breuk) : breuk;
{
  a - b
}
var
  h : breuk;
begin
  h.noemer := a.noemer * b.noemer;
  h.teller := a.teller * b.noemer - b.teller * a.noemer;
  minus := vereenvoudig(h);
end;

function maal(a,b : breuk) : breuk;
{
  a * b
}
var
  h : breuk;
begin
  h.noemer := a.noemer * b.noemer;
  h.teller := a.teller * b.teller;
  maal := vereenvoudig(h);
end;

function deel(a,b : breuk) : breuk;
{
  a / b
}
var
  h : breuk;
begin
  h.noemer := a.noemer * b.teller;
  h.teller := a.teller * b.noemer;
  deel := vereenvoudig(h);
end;

function gelijk(a,b : breuk) : boolean; { equality }
{
  Equality
}
var
  p,q : breuk;
begin
  p := vereenvoudig(a);
  q := vereenvoudig(b);
  gelijk := (p.teller = q.teller)
        and (p.noemer = q.noemer);
end;

function groter(a,b : breuk) : boolean;
{
  Greater
}
var
  p,q : breuk;
begin
  p := vereenvoudig(a);
  q := vereenvoudig(b);
  groter := (p.teller*q.noemer > q.teller*p.noemer);
end;

function dubbel(a : breuk) : double;
{
  Convert to double precision float
}
begin
  dubbel := a.teller/a.noemer;
end;

END.

program test; Uses breuken; begin Writeln(afdruk(plus(maak(1,2),maak(1,3)))); Writeln(afdruk(minus(maak(1,2),maak(1,3)))); Writeln(afdruk(maal(maak(2,3),maak(3,4)))); Writeln(afdruk(deel(maak(2,3),maak(3,4)))); Writeln(groter(maak(1,2),maak(1,3))); Writeln(groter(maak(1,3),maak(1,2))); Writeln(gelijk(maak(1,3),maak(9,27))); end.