RosettaCodeData/Task/Pascal-matrix-generation/CLU/pascal-matrix-generation.clu

56 lines
1.5 KiB
Plaintext

matrix = array[array[int]]
make_matrix = proc (gen: proctype (int,int,matrix) returns (int),
size: int) returns (matrix)
m: matrix := matrix$fill_copy(0, size, array[int]$fill(0, size, 0))
for y: int in int$from_to(0, size-1) do
for x: int in int$from_to(0, size-1) do
m[y][x] := gen(x,y,m)
end
end
return(m)
end make_matrix
lower = proc (x,y: int, m: matrix) returns (int)
if x>y then return(0)
elseif x=y | x=0 then return(1)
else return( m[y-1][x-1] + m[y-1][x] )
end
end lower
upper = proc (x,y: int, m: matrix) returns (int)
if x<y then return(0)
elseif x=y | y=0 then return(1)
else return( m[y-1][x-1] + m[y][x-1] )
end
end upper
symmetric = proc (x,y: int, m: matrix) returns (int)
if x=0 | y=0 then return(1)
else return(m[y][x-1] + m[y-1][x])
end
end symmetric
print_matrix = proc (s: stream, m: matrix, w: int)
for line: array[int] in matrix$elements(m) do
for item: int in array[int]$elements(line) do
stream$putright(s, int$unparse(item), w)
stream$putc(s, ' ')
end
stream$putl(s, "")
end
end print_matrix
start_up = proc ()
po: stream := stream$primary_output()
stream$putl(po, "Upper-triangular matrix:")
print_matrix(po, make_matrix(upper,5), 1)
stream$putl(po, "\nLower-triangular matrix:")
print_matrix(po, make_matrix(lower,5), 1)
stream$putl(po, "\nSymmetric matrix:")
print_matrix(po, make_matrix(symmetric,5), 2)
end start_up