Организация и описание процессов обработки данных с помощью двумерных массивов и подпрограмм, страница 3

Для нахождения максимального значения компонентов массива необходимо последовательно просмотреть все компоненты массива, сравнивая их с текущим максимальным значением. В качестве начального значения для текущего максимального значения можно выбрать, например, значение компонента, стоящего в строке и столбце с индексом 0. Если текущее значение оказалось меньше значения просматриваемого компонента массива, то его необходимо заменить значением просматриваемого компонента. Просматривать компоненты массива можно по строкам, а можно и по столбцам. Будем просматривать значения компонентов массива построчно: строки будем просматривать в сторону строк с большим значением индекса, а внутри строки столбцы будем просматривать в сторону столбцов с большим значением индекса. Для этого нам понадобятся два цикла: один вложенный в другой. Внешний цикл изменяет значения индекса строки, внутренний – значение индекса столбца. Во внутреннем цикле изменяем текущее максимальное значение, когда это необходимо. Описанный алгоритм представлен блок-схемой, изображённой ниже.

Консольное приложение с функцией, реализующей поиск максимального значения среди значений компонентов двумерного массива вещественных переменных, представлено ниже.

program PMatMax;

{$APPTYPE CONSOLE}

uses

  SysUtils;

Const

       Rows = 3;//число строк

       Columns = 3;//число столбцов

Type

       RowInd = 0 .. Rows – 1;//тип индекса строки

       ColInd = 0.. Columns – 1;//тип индекса столбца

       Matrix = array [RowInd, ColInd] of real;//тип массива

//------------------------------------------------------------------------------------

function MatMax(const M: Matrix): Real;

//Возвращает максимальное значение массива

var

  I: RowInd;//Индекс строки

  J: ColInd;//Индекс столбца

begin

  Result:= M[Low(ColInd),Low(RowInd)];

  for I:= Low(RowInd) to High(RowInd) do//Цикл по строкам

    for J:= Low(ColInd) to High(ColInd) do//Цикл по столбцам

      if Result < M[I,J] then//Изменяем текущее максимальное значение

       Result:= M[I,J];

end;

//------------------------------------------------------------------------------------

Var

       A: Matrix = ((2, 3, 5), (4, -3 , 9), (1, 8, 7));

  R: Real;

begin

//-----------Вызов функции-----------------------------------------------------

  R:= MatMax(A);

  writeln('Summa = ', R:6:2);

//-----------Вызов функции-----------------------------------------------------

  writeln('Summa = ', MatMax(A):6:2);

  readln;

end.

З а д а ч и  № 14

Написать и оттестировать функцию. Функция получает через параметр двумерный массив вещественных переменных (типа Matrix) с одинаковым числом строк и столбцов и возвращает максимальное значение среди значений компонентов массива, лежащих на главной диагонали.

Например:

Исходный массив

2

3

8

4

5

9

1

6

7

Максимальное значение

7

Для нахождения максимального среди значений компонентов массива, лежащих на главной диагонали, необходимо последовательно просмотреть все эти компоненты массива, сравнивая их значения с текущим максимальным значением. В качестве начального значения для текущего максимального значения можно выбрать, например, значение компонента, стоящего в нулевом столбце нулевой строки. Если текущее значение оказалось меньше значения просматриваемого компонента главной диагонали, то его необходимо заменить значением просматриваемого компонента. Для организации просмотра значений компонентов главной диагонали будем использовать свойства индексов строки и столбца для этих компонентов. Оно состоит в том, что для элементов главной диагонали массива типа Matrix значение индекса строки равно значению индекса столбца. В силу этого свойства для просмотра всех диагональных компонентов нам будет достаточно одного цикла. Описанный алгоритм представлен блок-схемой, изображённой ниже.

Консольное приложение с функцией, реализующей поиск максимального значения среди значений компонентов двумерного массива вещественных переменных, лежащих на главной диагонали, представлено ниже.

program PMaxMDig;

{$APPTYPE CONSOLE}

uses

  SysUtils;

Const

       Rows = 3;// число строк

       Columns = 3;// число столбцов

Type

       RowInd = 0 .. Rows – 1;//тип индекса строки

       ColInd = 0.. Columns – 1;//тип индекса столбца

       Matrix = array [RowInd, ColInd] of real;//тип массива

//------------------------------------------------------------------------------

function MatMaxMD(const M: Matrix): Real;

//Возвращает максимальное значение компонентов главной диаго-//нали массива

var

  I: RowInd;

begin

  Result:= M[Low(ColInd),Low(RowInd)];

  for I:= Low(RowInd) to High(RowInd) do

      if Result < M[I,I] then Result:= M[I,I];

end;

//------------------------------------------------------------------------------

Var

       A: Matrix = ((2, 3, 5), (4, -3 , 9), (1, 8, 7));

  R: Real;

begin

//-----------Вызов функции-------------------------------------------------

  R:= MatMaxMD(A);

  writeln('Summa = ', R:6:2);

//-----------Вызов функции-------------------------------------------------

  writeln('Summa = ', MatMaxMD(A):6:2);

  readln;

end.

З а д а ч а  № 25

Написать и оттестировать функцию. Функция получает через параметры двумерный массив вещественных переменных (тип Matrix) и одномерный массив (тип Vector). Функция вычисляет и возвращает произведение матрицы на вектор-столбец (одномерный массив типа vector). Двумерный массив (матрица) и одномерный массив (вектор- столбец) должны быть согласованы по умножению: число столбцов матрицы должно быть равно числу строк вектора-столбца. Результатом перемножения будет вектор-столбец, число строк в котором будет равно числу строк матрицы.

Из матричной алгебры известно, что произведение матрицы A на вектор-столбец B есть вектор-столбец

,

элементы которого вычисляются в соответствии с приведённой ниже формулой

.

Отсюда следует, что элемент i-й строки вектора-столбца результата X получается перемножением элементов i-й строки матрицы A на соответствующие элементы вектора-столбца B.

Для перемножения матрицы на вектор-столбец необходимо построчно с первой до последней строки перемножать элементы строки матрицы на соответствующие элементы вектора-столбца. Для этого нам понадобятся два цикла: один вложенный в другой. Внешний цикл изменяет значения индекса строки, внутренний – значение индекса столбца. Во внутреннем цикле перемножаем элементы строки матрицы на элементы столбца, накапливая результат. Описанный алгоритм представлен блок-схемой, изображённой ниже.

Текст функции, реализующей приведённый алгоритм.

//-----------------------------------------------------------------------------------

function MatByCol(const m: Matrix; const b: Vector): Vector;

//Произведение матрицы А на вектор-столбец В можно получить
//следующим образом:

var

  I: RowInd;

  J: ColInd;

begin

  for I:= Low(RowInd) to High(RowInd) do begin

    Result[I]:= 0;

    for J:= Low(ColInd) to High(ColInd) do

      Result[I]:= Result[I] + A[I,J] * B[J];

  end;

end;

//------------------------------------------------------------------------------