Двойной цикл: табулирование 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 [2107 просмотров]