86 lines
2.6 KiB
Ada
86 lines
2.6 KiB
Ada
-- for I/O
|
|
with Ada.Text_IO; use Ada.Text_IO;
|
|
with Ada.Integer_Text_IO; use Ada.Integer_Text_IO;
|
|
with Ada.Float_Text_IO; use Ada.Float_Text_IO;
|
|
|
|
-- for estimating the maximum width of a column
|
|
with Ada.Numerics.Generic_Elementary_Functions;
|
|
|
|
procedure PascalMatrix is
|
|
|
|
type Matrix is array (Positive range <>, Positive range <>) of Natural;
|
|
|
|
-- instantiate Generic_Elementary_Functions for Float type
|
|
package Math is new Ada.Numerics.Generic_Elementary_Functions(Float_Type => Float);
|
|
use Math;
|
|
|
|
procedure Print(m: in Matrix) is
|
|
-- determine the maximum width of a column
|
|
w: Float := Log(Float(m'Length(1)**(m'Length(1)/2)), 10.0);
|
|
width: Positive := Natural(Float'Ceiling(w)) + 1;
|
|
begin
|
|
for i in m'First(1)..m'Last(1) loop
|
|
Put("( ");
|
|
for j in m'First(2)..m'Last(2) loop
|
|
Put(m(i,j), width);
|
|
end loop;
|
|
Put(" )"); New_Line(1);
|
|
end loop;
|
|
end Print;
|
|
|
|
function Upper_Triangular(n: in Positive) return Matrix is
|
|
result: Matrix(1..n, 1..n) := (
|
|
1 => ( others => 1 ),
|
|
others => ( others => 0 )
|
|
);
|
|
begin
|
|
for i in 2..n loop
|
|
result(i,i) := 1;
|
|
for j in i+1..n loop
|
|
result(i,j) := result(i,j-1) + result(i-1,j-1);
|
|
end loop;
|
|
end loop;
|
|
return result;
|
|
end Upper_Triangular;
|
|
|
|
function Lower_Triangular(n: in Positive) return Matrix is
|
|
result: Matrix(1..n, 1..n) := (
|
|
others => ( 1 => 1, others => 0 )
|
|
);
|
|
begin
|
|
for i in 2..n loop
|
|
result(i,i) := 1;
|
|
for j in i+1..n loop
|
|
result(j,i) := result(j-1,i) + result(j-1,i-1);
|
|
end loop;
|
|
end loop;
|
|
return result;
|
|
end Lower_Triangular;
|
|
|
|
function Symmetric(n: in Positive) return Matrix is
|
|
result: Matrix(1..n, 1..n) := (
|
|
1 => ( others => 1 ),
|
|
others => ( 1 => 1, others => 0 )
|
|
);
|
|
begin
|
|
for i in 2..n loop
|
|
for j in 2..n loop
|
|
result(i,j) := result(i,j-1) + result(i-1,j);
|
|
end loop;
|
|
end loop;
|
|
return result;
|
|
end Symmetric;
|
|
|
|
n: Positive;
|
|
|
|
begin
|
|
Put("What dimension Pascal matrix would you like? ");
|
|
Get(n);
|
|
Put("Upper triangular:"); New_Line(1);
|
|
Print(Upper_Triangular(n));
|
|
Put("Lower triangular:"); New_Line(1);
|
|
Print(Lower_Triangular(n));
|
|
Put("Symmetric:"); New_Line(1);
|
|
Print(Symmetric(n));
|
|
end PascalMatrix;
|