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

Пример 2 выполнения задания на матрицы

Удалить из матрицы B(m,n),m10,n8, строки, содержащие отрицательные элементы.

Можно предложить два варианта решения этой задачи.

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

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

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

Фрагмент программы имеет следующий вид.

. . . . . . . . .

  1. K:=0;

  2. for I:=1 to M do

  3. begin

  4. Pr:=true; // отрицательных элементов нет

  5. J:=1;

  6. while Pr and (J<=N) do

  7. if B[I,J]<0 then

  8. Pr:=false

  9. else

  10. J:=J+1;

  11. if Pr and (I>K+1) then

  12. begin

  13. K:=K+1;

  14. for J:=1 to N do

  15. B[K,J]:=B[I,J];

  16. end;

  17. end;

  18. if K>0 then

  19. begin

  20. WriteLn('Полученная матрица');

  21. for I:=1 to K do

  22. begin

  23. for J:=1 to N do

  24. Write(B[I,J]:6:1,' ');

  25. WriteLn;

  26. end;

  27. end

  28. else

  29. WriteLn('Полученная матрица пустая');

  30. . . . . .

Пример 3 выполнения задания на матрицы

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

Cij = ,

где A,B умножаемые матрицы,

i, j – индексы очередного элемента матрицы C,

n – количество столбцов первой матрицы (строк второй матрицы).

Перемножение матриц возможно только в том случае, если количество столбцов первой матрицы равно количеству строк второй матрицы. Рассматриваемый пример интересен тем, что умножение матриц приводит к необходимости программирования тройного цикла. Это связано с тем, что один элемент, представляющий собой сумму попарных произведений соответствующих элементов исходных матриц, вычисляется в цикле, а вычисление всех элементов матрицы требует организации еще вложенного цикла. Следующий фрагмент программы демонстрирует решение рассмотренной задачи для матриц A(m,n), B(n,n2), m10, n8, n212.

  1. Program matr3;

  2. {$APPTYPE CONSOLE}

  3. uses

  4. SysUtils;

  5. const

  6. Mm=10;Nn=8; Nn2=12;

  7. type

  8. matr1=array[1..Mm,1..Nn] of Real;

  9. matr2=array[1..Nn,1..Nn2] of Real;

  10. matrres=array[1..Mm,1..Nn2] of Real;

  11. var A:matr1;B:matr2;C:matrres;

  12. I,J,M1,N1,M2,N2,K:Integer;

  13. S:Real;

  14. ....................

  15. begin

  16. //ввод m1,n1, m2, n2 и матриц A и B

  17. ....................

  18. if N1<>M2 then

  19. WriteLn('Умножение матриц невозможно')

  20. else

  21. begin

  22. for I:=1 to M1 do

  23. for J:=1 to N2 do

  24. begin

  25. S:=0;

  26. for K:=1 to N do

  27. S:=S+A[I,K]*b[K,J];

  28. C[I,J]:=S;

  29. end;

  30. //вывод матрицы С

  31. ....................

  32. end;

  33. ReadLn;

  34. end.

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

  • Диагональные элементы имеют одинаковые индексы: a[i,i], i=1,n .

  • Элементы, стоящие над главной диагональю (образующие верхнюю треугольную матрицу), не включая диагональ: a[i,j] , i=1,n-1; j=i+1,n.

  • Элементы, стоящие над главной диагональю, включая диагональ: a[i,j] , i=1,n; j=i,n.

  • Элементы, стоящие под главной диагональю (образующие нижнюю треугольную матрицу), не включая диагональ: a[i,j] , i=2,n; j=1,i-1.

  • Элементы, стоящие под главной диагональю, включая диагональ: a[i,j] , i=1,n; j=1,i.

  • Элементы побочной диагонали a[i,n-i+1], i=1,n

  • Элементы, стоящие над побочной диагональю, не включая диагональ: a[i,j] , i=1,n-1; j=1,n-i.

  • Элементы, стоящие над побочной диагональю, включая диагональ:

  • a[i,j] , i=1,n; j=i,n-i+1.

  • Элементы, стоящие под побочной диагональю, не включая диагональ: a[i,j] , i=2,n; j=n-i+2,n.

  • Элементы, стоящие под побочной диагональю, включая диагональ: a[i,j] , i=1,n; j=n-i+1,n.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]