Как правильно? Пожалуйста, поправьте меня.
Вот ведь набросились. Ну есть пара недочетов, подумаешь, с кем не бывает.
Вот смотрите, у Вас цикл:
s:=0;
k:=0;
for i:=1 to n-1 do
for j:=1 to n-i do
begin
k:=k+1;
s:=s+sqr(a[i,j]);
end;
Вам тут кагбе намекают, что
зависит только от
, поэтому рассчитывать его в цикле никакой необходимости нет; можно просто сразу присвоить нужное значение
. И, с одной стороны, это правильно. Но с другой -- в том, как это сделано у Вас, на мой взгляд, тоже ничего страшного нет: меньше шансов просчитаться с количеством элементов над побочной диагональю :)
Ну и второе:
for i:=1 to n do
for j:=1 to n do
if (i=j) then a[i,j]:=s/k
Тут просто не надо двойного цикла, достаточно одинарного:
for i:=1 to n do
a[i,i] := s/k
Не, ну конечно, можно еще
посчитать где-то один раз до цикла, но любой компилятор прекрасно справится с этим самостоятельно. Ну а даже если и не справится, то потеря времени на этой "неэффективности" составит наносекунды, что в сравнении с временем ручного ввода матрицы как-то не впечатляет. К тому же, так короче и понятней.
Ну разве что вместо "k:=k+1;" лучше, конечно, "inc(k);".
Стесняюсь спросить, это почему? По-моему, так исключительно дело вкуса.