RosettaCodeData/Task/Pascal-matrix-generation/ALGOL-W/pascal-matrix-generation.alg

67 lines
2.5 KiB
Plaintext

begin
% initialises m to an upper Pascal matrix of size n %
% the bounds of m must be at least 1 :: n, 1 :: n %
procedure upperPascalMatrix ( integer array m( *, * )
; integer value n
) ;
begin
for j := 1 until n do m( 1, j ) := 1;
for i := 2 until n do begin
m( i, 1 ) := 0;
for j := 2 until n do m( i, j ) := m( i - 1, j - 1 ) + m( i, j - 1 )
end for_i
end upperPascalMatrix ;
% initialises m to a lower Pascal matrix of size n %
% the bounds of m must be at least 1 :: n, 1 :: n %
procedure lowerPascalMatrix ( integer array m( *, * )
; integer value n
) ;
begin
for i := 1 until n do m( i, 1 ) := 1;
for j := 2 until n do begin
m( 1, j ) := 0;
for i := 2 until n do m( i, j ) := m( i - 1, j - 1 ) + m( i - 1, j )
end for_j
end lowerPascalMatrix ;
% initialises m to a symmetric Pascal matrix of size n %
% the bounds of m must be at least 1 :: n, 1 :: n %
procedure symmetricPascalMatrix ( integer array m( *, * )
; integer value n
) ;
begin
for i := 1 until n do begin
m( i, 1 ) := 1;
m( 1, i ) := 1
end for_i;
for j := 2 until n do for i := 2 until n do m( i, j ) := m( i, j - 1 ) + m( i - 1, j )
end symmetricPascalMatrix ;
begin % test the pascal matrix procedures %
% print the matrix m with the specified field width %
% the bounds of m must be at least 1 :: n, 1 :: n %
procedure printMatrix ( integer array m( *, * )
; integer value n
; integer value fieldWidth
) ;
begin
for i := 1 until n do begin
write( i_w := fieldWidth, s_w := 0, " ", m( i, 1 ) );
for j := 2 until n do writeon( i_w := fieldWidth, s_w := 0, " ", m( i, j ) )
end for_i
end printMatrix ;
integer array m( 1 :: 10, 1 :: 10 );
integer n, w;
n := 5; w := 2;
upperPascalMatrix( m, n ); write( "upper:" ); printMatrix( m, n, w );
lowerPascalMatrix( m, n ); write( "lower:" ); printMatrix( m, n, w );
symmetricPascalMatrix( m, n ); write( "symmetric:" ); printMatrix( m, n, w )
end
end.