uses crt;
const nmax=20;
var c:array[1..nmax,1..nmax] of integer;
n,m,i,j,k:byte;
sm,x:integer;
begin
clrscr;
randomize;
repeat
write('Количество строк=');readln(n);
until n in [1..nmax];
repeat
write('Количество столбцов=');readln(m);
until m in [1..nmax];
for i:=1 to n do
for j:=1 to m do
c[i,j]:=random(10);
{считаем сумму в столбце}
for j:=1 to m do
begin
sm:=0;
for i:=1 to n do
sm:=sm+c[i,j];
c[n+1,j]:=sm;{и записываем в дополнительную строку}
end;
writeln('Исходная матрица:');
for i:=1 to n do
begin
write(' ':5);{5 пробелов в начале строки}
for j:=1 to m do
write(c[i,j]:5);{элементы строки}
writeln;
end;
writeln;
write('Сумма');{дополнительная строка с суммами}
for j:=1 to m do
write(c[n+1,j]:5);
writeln;
writeln;
{перестановка столбцов по возрастанию значений в последней строке}
for j:=1 to m-1 do
for k:=j+1 to m do
if c[n+1,j]>c[n+1,k] then
for i:=1 to n+1 do
begin
x:=c[i,j];
c[i,j]:=c[i,k];
c[i,k]:=x;
end;
writeln('Столбцы упорядочены:');
for i:=1 to n do
begin
write(' ':5);
for j:=1 to m do
write(c[i,j]:5);
writeln;
end;
writeln;
write('Сумма');
for j:=1 to m do
write(c[n+1,j]:5);
readln
end.