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;