Весьма распространенной задачей является создание массива значений некоторой заданной функции f(x) на заданном отрезке изменения аргумента xн < x < xк (от x–начального до x–конечного) с заданным шагом D x = h. Такая задача возникает в случаях приближенного вычисления интегралов, поиска локальных экстремумов функции, ее наибольших и наименьших значений, численного решения уравнений и т.п. Иногда одновременно с массивом значений функции необходимо иметь и массив соответствующих значений аргумента.
Рассмотрим программную реализацию данной задачи на конкретном примере, который без труда может быть обобщен на любые другие уравнения функций, величин отрезков и шагов.
Пример 3.1 Пусть необходимо создать массивы значений аргумента x и функции y для функции
на отрезке 0
x
6, с шагом h = 0.25.
Отметим прежде всего, что количество элементов массива в таком случае вычисляется по формуле
где хн и хк – начальное и конечное значения аргумента.
В данном случае n=
+ 1 = 25.
Последовательные значения аргумента X удобно вычислять по формуле
Xi = Xн + h (i – 1).
Фрагмент программы, реализующей поставленную задачу, может быть оформлен следующим образом:
program Masfun;
type mas= array [1..25] of real;
var x,y:mas; i:integer;
Begin
for i:=1 to 25 do
Begin
x[i] = 0 + 0.25*(i–1);
y[i] = 2*exp(1.5*x[i])*cos(x[i]/2–0.5);
writeln('x=';x[i]:5:2;' y=';y[i]:6:3)
end;
end.
СУММИРОВАНИЕ И ПЕРЕМНОЖЕНИЕ ЭЛЕМЕНТОВ МАССИВОВ
Рассмотрим задачу нахождения суммы и произведения всех элементов некоторого одномерного массива X т.е. пусть дано
X1,X2,... Xk,... Xn
и требуется вычислить:
S = X1 + X2 +... + Xk +...+ Xn;
P = X1 * X2 *... * Xk *...* Xn.
Из математической формулировки задачи вытекает и алгоритм вычисления суммы: присваиваем сумме значение первого слагаемого, а затем наращиваем эту величину последовательным прибавлением к ней каждого очередного слагаемого, начиная со второго и кончая последним. Делать это следует, разумеется, в цикле. Таким образом сумма может быть вычислена фрагментом из двух операторов:
S:= X[1];
for k:= 2 to n do S:= S + x[k];
Аналогично вычисляется и произведение:
P:= x[1];
for k:= 2 to n do P:= P * x[k];
Во многих случаях, однако, более удобно начинать вычисление суммы и произведения с присвоения им первоначально, соответственно нулевого и единичного значений, после чего наращивание суммы и произведения начинать с первого элемента массива, т.е. одновременное вычисление величин S и P может быть в данном случае выполнено и так:
S:=0;P:=1;
for k:=1 to n do
Begin
S:= S + x[k];
P:= P * x[k];
end;
При суммировании и перемножении элементов двумерных массивов – матриц требуется перебирать все элементы по рядам: либо по строкам и в каждой строке по столбцам, либо по столбцам и в каждом столбце по строкам. Например вычислить сумму и произведение всех элементов матрицы A размером m * n (см. пример 2.9) можно с помощью следующих операторов:
S:=0; P:=1;
for i:=1 to m do
Begin
for j:=1 to n do
Begin
S:= S + a[i,j];
P:= P * a[i,j];
end;
end;
Результат не изменится, если в данном фрагменте операторы циклов по i и j поменять местами.
Рассмотрим еще одну задачу, довольно часто встречающуюся в работе с массивами. Пусть дано два одинаковых по размеру массива X и Y (i=1,2,...n). Требуется вычислить величину
SP = x1 y1 + x2 y2 +... + xi yi +... + xn yn.
Отметим, что такая сумма – сумма попарных произведений одноименных элементов двух массивов (векторов) называется скалярным произведением этих массивов. Вычисление этого произведения может быть выполнено так:
SP:= 0;
for i:=1 to n do SP:= SP + x[i]*y[i];