Unit Breuken; { Automated Balancing of Chemical Equations ========================================= This software has been designed and it is CopyLefted by Han de Bruijn: (===) @-O^O-@ #/_\# ### Arithmetic with integer/integer fractions ----------------------------------------- } INTERFACE type breuk = record { fraction } teller,noemer : int64; { numerator,denominator } end; function maak(a,b : integer) : breuk; { make } function vereenvoudig(f : breuk) : breuk; { Simplify } 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 } procedure effe_testen; { Just a test } IMPLEMENTATION function GGD(aa,bb : int64) : int64; { Greatest Common Divisor } var a,b,uit : int64; begin a := abs(aa); b := abs(bb); if b = 0 then uit := a else uit := GGD(b,a mod b); GGD := uit; end; function maak(a,b : integer) : breuk; { Make } var h : breuk; begin if (b < 0) then begin a := -a; b := -b; end; h.teller := a; h.noemer := b; maak := h; end; function Letterlijk(nr : int64) : string; { Number to String } const cijfer : string = '0123456789'; var no : int64; t,tel,wel : integer; vgl : string; c : char; min : boolean; begin no := nr; min := false; if no < 0 then begin min := true; no := - nr; end; tel := 0; { Analysis } 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 min then vgl := '-' + vgl; if vgl = '' then vgl := '0'; Letterlijk := vgl; end; function afdruk(f : breuk) : string; { Print } begin afdruk := Letterlijk(f.teller) + '/' + Letterlijk(f.noemer); end; function vereenvoudig(f : breuk) : breuk; { Simplify } var h : breuk; deler :int64; min : boolean; begin min := (f.teller < 0); h := f; if min then h.teller := - f.teller; deler := GGD(h.teller,h.noemer); if deler > 0 then begin h.teller := h.teller div deler; h.noemer := h.noemer div deler; end; if min then h.teller := - h.teller; 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; if h.noemer < 0 then begin h.teller := - h.teller; h.noemer := - h.noemer; end; 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; procedure effe_testen; var a,b : breuk; begin a := maak(1,2); b := maak(1,3); Writeln(afdruk(a),' + ',afdruk(b),' = ',afdruk(plus(a,b))); a := maak(-1,2); b := maak(1,3); Writeln(afdruk(a),' + ',afdruk(b),' = ',afdruk(plus(a,b))); a := maak(2,3); b := maak(3,4); Writeln(afdruk(a),' * ',afdruk(b),' = ',afdruk(maal(a,b))); a := maak(2,3); b := maak(3,4); Writeln(afdruk(a),' / ',afdruk(b),' = ',afdruk(deel(a,b))); a := maak(1,2); b := maak(1,3); Writeln(afdruk(a),' > ',afdruk(b),' : ',groter(a,b)); b := maak(1,2); a := maak(1,3); Writeln(afdruk(a),' > ',afdruk(b),' : ',groter(a,b)); b := maak(1,3); a := maak(9,27); Writeln(afdruk(a),' = ',afdruk(b),' : ',gelijk(a,b)); end; END.