БлогNot. Двойной цикл: табулирование f(x,y) и обработка строк или столбцов матрицы

Двойной цикл: табулирование f(x,y) и обработка строк или столбцов матрицы

Именно эти 2 типовых алгоритма вызвали почему-то наибольшее количество ошибок. Приведу для них шаблоны на Паскале, удобном для иллюстрации несложных учебных задач.

1. Табулирование функции двух переменных. В примере аргументы функции x и y меняются от 0 до 1 включительно с шагом, равным 0.1, но конкретные пределы табулирования неважны, важно, что в любом случае, цикл по y должен находиться полностью внутри цикла по x (включая присваивание "игреку" начального значения):

x := 0;
while x <= 1 do begin
  y := 0;
  while y <= 1 do begin
    {Вычисление f(x,y) и печать строки таблицы}
    y := y + 0.1;
  end;
  x := x + 0.1;
end;

Здесь и далее приводится только основная часть кода, опишите переменные и присвойте им начальные значения самостоятельно.

Разумеется, можно и переставить циклы местами, изменяя x быстрее, чем y:

y := 0;
while y <= 1 do begin
  x := 0;
  while x <= 1 do begin
    {Вычисление f(x,y) и печать строки таблицы}
    x := x + 0.1;
  end;
  y := y + 0.1;
end;

2. Расчет, выполняемый в каждой строке (или столбце) матрицы. Для простоты возьмём матрицу A размерностью 3x3, предположим, что она уже введена или задана и найдём суммы элементов строк матрицы. Суть дела в том, что типовой алгоритм реализуется каждый раз заново при переходе к новому шагу внешнего цикла. Скажем, вычисление суммы всех элементов матрицы могло бы выглядеть так:

s := 0;
for i:=1 to 3 do begin
  for j:=1 to 3 do begin
   s := s + a[i,j];
  end;
end;
writeln ('String ',i, ' summa= ', s);

Если же нам требуются суммы элементов каждой строки, код изменится на следующий:

for i:=1 to 3 do begin
  {Алгоритм реализуется заново при переходе к новой строке!}
  s := 0;
  for j:=1 to 3 do begin
   s := s + a[i,j];
  end;
  writeln ('String ',i, ' summa= ', s);
end;

А для поиска сумм элементов каждого столбца достаточно поменять местами циклы по i и по j:

for j:=1 to 3 do begin
  s := 0;
  for i:=1 to 3 do begin
   s := s + a[i,j];
  end;
  writeln ('String ',i, ' summa= ', s);
end;

Ничто не мешало нам не "терять" очередную сумму s при переходе к новому столбцу (или строке), а составить из них вектор s размерностью 3, в этом случае последний код изменится так:

for j:=1 to 3 do begin
  s[j] := 0;
  for i:=1 to 3 do begin
   s[j] := s[j] + a[i,j];
  end;
  writeln ('String ',i, ' summa= ', s[j]);
end;

09.01.2019, 11:11 [1944 просмотра]


теги: учебное алгоритм pascal

К этой статье пока нет комментариев, Ваш будет первым