Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
4_1_2_3 Разработка программ со структурой вложе...doc
Скачиваний:
5
Добавлен:
23.11.2019
Размер:
335 Кб
Скачать
☆

Обработка матриц

Матрицы представляют собой один из наиболее удобных математических объектов, обработка которого ведет к необходимости программирования вложенных циклов. При программной реализации обработки матриц будем использовать двумерные массивы (элементы которых имеют два индекса), считая, что элементы Хij матрицы Х, i=1, 2,...,m, j=1, 2,…,n размещаются в ячейках соответствующего массива с такими же индексами. Это позволит сделать текст программы удобным для понимания процесса обработки и уменьшить, в некоторых случаях, объём вычислений. Соответственно первый индекс массива будем называть номером строки, а второй – номером столбца.

Имея в виду соответствие элементов матрицы элементам массива, им дают, как правило, одинаковые имена; иногда в пояснениях к программе вместо термина «массив» будем использовать термин «матрица», как бы отождествлять объекты предметной области с объектами программы для лучшего понимания процессов обработки.

При постановке задач на обработку матриц с целью обеспечения применимости программ для обработки матриц, например, матрицы Х, размеры которых не должны превосходить заданных значений, например, m12 и n14, будем использовать сокращенное обозначение, например, Х(m,n), m12, n14. Указанные в таком обозначении максимальные значения индексов матрицы будут использоваться в объявлении типа соответствующего двумерного массива, а сами эти максимальные значения индексов желательно объявить в виде именованных констант. Если также учесть, что двумерный массив можно рассматривать и объявлять как одномерный массив с базовым типом массив, то объявление типа массива для хранения матриц с размерами, не превышающими 12х14 будет следующим.

  1. const

  2. mMax=12; nMax=14;

  3. type

  4. //объявление типа строки двумерного массива типа tM

  5. tV=array[1..mMax] of Real;

  6. //объявление типа двумерного массива

  7. tM=array[1..nMax] of tV;

(при описании типа двумерного массива необходимо задавать тип обоих индексов и тип самих элементов матрицы).

Такое двухэтапное объявление типа двумерного массива удобно тем, что строка массива будет совместима по присваиванию с одномерным массивом того же типа tV.

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

Переменная-двумерный массив объявляется в разделе объявления переменных

  1. var

  2. X:tM;

  3. Менее предпочтительными, но допустимыми будут объявления типа

  4. tM=array[1..mMax, 1..nMax] of Real;

или

  1. tM=array[1..12, 1..14] of Real;

и объявление массива одной строкой

  1. var

  2. X:array[1.. MMax, 1..NMax] of Real;

или

  1. X:array[1..12, 1..14] of Real;

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

При работе с матрицами надо помнить, что первый индекс соответствует номеру строки, а второй индекс – номеру столбца.

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

Фрагмент программы, обеспечивающей ввод и вывод матрицы Х(m,n), m12, n14, ранее описанной, имеет следующий вид:

  1. WriteLn(‘Введите количество строк и столбцов матрицы’);

  2. ReadLn(M,N);

  3. WriteLn(‘Введите элементы матрицы по строкам’);

  4. for I:=1 to M do //цикл ввода всех строк матрицы

  5. begin

  6. for J:=1 to N do // цикл ввода очередной строки матрицы

  7. Read(X[I,J]);

  8. ReadLn; //переход в начало новой строки файла ввода

  9. end;

  10. WriteLn(‘Введенная матрица’);

  11. for I:=1 to M do //цикл вывода всех строк матрицы

  12. begin

  13. for J:=1 to N do // цикл вывода очередной строки матрицы

  14. Write(X[I,J]:6:1,’ ‘);

  15. WriteLn; //переход в начало новой строки файла вывода

  16. end;

Порядок расположения циклов при вводе/выводе имеет существенное значение. Если поменять местами заголовки циклов, то вводимые значения будут присваиваться элементам столбца, а не элементам строки. При выводе матрицы в этом случае будет выведена фактически транспонированная матрица

Также надо соблюдать аккуратность при использовании приемов программирования. Например, при вычислении сумм и произведений надо следить за тем, в каком месте программы присваиваются начальные значения соответствующим переменным.

Следующий фрагмент программы позволяет вычислить сумму и произведение всех элементов матрицы:

  1. S:=0; Pr:=1;

  2. for I:=1 to M do

  3. for J:=1 to N do

  4. begin

  5. S:=S+A[I,J];

  6. Pr:=Pr*A[I,J];

  7. end;

  8. WriteLn(‘s=’,S:8:2,’ pr=’,Pr:8:2);

При изменении места расположения операторов присваивания S:=0; Pr:=1; смысл вычислений меняется:

  1. for I:=1 to M do

  2. begin

  3. S:=0; Pr:=1;

  4. for J:=1 to N do

  5. begin

  6. S:=S+A[I,J];

  7. Pr:=Pr*A[I,J];

  8. end;

  9. WriteLn(‘s=’,S:8:2,’ pr=’,Pr:8:2);

  10. end;

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

При вычислении максимального и минимального элементов матрицы также надо правильно устанавливать начальные значения вычисляемых переменных, а также правильно задавать пределы изменения параметров циклов:

  1. Amax:=A[1,1]; Imax:=1; Jmax:=1;

  2. Amin:=A[1,1]; Imin:=1; Jmin:=1;

  3. for I:=1 to M do

  4. for J:=1 to N do

  5. if A[I,J]>Amax then

  6. begin

  7. Amax:=A[I,J]; Imax:=I; Jmax:=J;

  8. end

  9. else if A[I,J]<Amin then

  10. begin

  11. Amin:=A[I,J]; Imin:=I; Jmin:=J;

  12. end;

  13. WriteLn(‘amax=’,Amax:8:2,’ imax=’,Imax:2

  14. ,’ jmax=’,Jmax:2,’ amin=’,Amin:8:2

  15. ,’ imin=’,Imin:2,’ jmin=’,Jmin:2,);

В приведенном фрагменте программы нельзя опускать операторы присваивания начальных значений индексам минимального и максимального элементов (Imax:=1; Jmax:=1; Imin:=1; Jmin:=1;). В случае отсутствия указанных операторов индексы искомых элементов будут не определены в том случае, если первый элемент A[1,1] является максимальным (минимальным).

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

  1. Amax:=A[1,1]; Imax:=1; Jmax:=1;

  2. Amin:=A[1,1]; Imin:=1; Jmin:=1;

  3. for I:=2 to M do

  4. for J:=1 to N do

  5. .....................

Рассмотрим примеры обработки матриц.