The Ada Program: fraction_package.adb

  1 -- fraction_package.adb:  fraction (rational numbers) package
  2 with GCD;
  3 package body Fraction_Package is
  4    function Rat (Num: Integer; Den: Positive:=1) return Fraction is
  5       G: Natural := GCD (abs Num, Den);
  6    begin
  7       return Fraction'(Num=>Num/G, Den=>Den/G);
  8    end Rat;
  9    function Is_Zero (F: Fraction) return Boolean is
 10    begin
 11       return (F.Num = 0);
 12    end Is_Zero;
 13    function "/" (Left: Integer; Right: Integer) return Fraction is
 14    begin
 15       if Right < 0 then
 16          return (Rat (Num=>-Left, Den=>abs Right));
 17       else
 18          return (Rat (Num=>Left, Den=>Right));
 19       end if;
 20    end "/";
 21    function "/" (Left, Right: Fraction) return Fraction is
 22    begin
 23       return (Left.Num*Right.Den) / (Left.Den*Right.Num);
 24    end "/";
 25 
 26    function "*" (Left, Right: Fraction) return Fraction is
 27    begin
 28       return (Left.Num*Right.Num) / (Left.Den*Right.Den);
 29    end "*";
 30 
 31    function "-" (Right: Fraction) return Fraction is
 32    begin
 33       return Fraction' (Num=>-Right.Num, Den=>Right.Den);
 34    end "-";
 35 
 36    function "+" (Left, Right: Fraction) return Fraction is
 37       Num: constant Integer  := Left.Num*Right.Den + Right.Num*Left.Den;
 38       Den: constant Positive := Left.Den * Right.Den;
 39    begin
 40       return (Num / Den);
 41    end "+";
 42 
 43    function "-" (Left, Right: Fraction) return Fraction is
 44    begin
 45       return (Left + (-Right));
 46    end "-";
 47 end Fraction_Package;