- •4. Организация программ со структурой вложенных циклов
- •4. Организация программ со структурой вложенных циклов
- •; // Конец второго внутреннего цикла
- •//Вычисление и печать таблицы умножения чисел от 1 до 100
- •Write(I*j); // умножение выполняется 10000 раз
- •Begin begin
- •WriteLn(s:7:2); WriteLn(s:7:2);
- •Вычисление определенного интеграла с заданной точностью
- •Пример программы вычисления определенного интеграла с точностью методом трапеций
- •Задания 4.1 на вычисление интеграла с точностью.
- •Вычисление наибольшего (наименьшего) значения функции с заданной точностью на заданном интервале
- •// Числения максимума
- •// Тервала
- •Задания 4.2 на нахождение экстремума функции с заданной точностью.
- •Обработка матриц
- •Менее предпочтительными, но допустимыми будут объявления типа
- •X:array[1.. MMax, 1..NMax] of Real;
- •X:array[1..12, 1..14] of Real;
- •Пример 1 выполнения задания на матрицы
- •Пример 2 выполнения задания на матрицы
- •Пример 3 выполнения задания на матрицы
- •Пример 4 выполнения задания на матрицы
- •Задания 4.3 на обработку матриц (вложенные циклы)
Пример 2 выполнения задания на матрицы
Удалить из матрицы B(m,n),m10,n8, строки, содержащие отрицательные элементы.
Можно предложить два варианта решения этой задачи.
Если понимать условие буквально, то в случае наличия отрицательных элементов в очередной строке матрицы, следует именно удалить эту строку. Выполняется эта операция путем переписи всех строк, расположенных после удаляемой, на одну строку в сторону меньших номеров строк и уменьшения общего количества строк матрицы на единицу. При этом в ходе анализа надо учитывать, что после удаления очередной строки на ее место перепишется новая строка, которая еще не анализировалась, поэтому номер строки изменять не следует. Если же текущая строка не удалялась, для перехода к следующей строке текущий номер следует увеличить на единицу. Поскольку в этом случае изменяется количество строк, а эта величина является конечным значением параметра цикла, то учитывая правила организации цикла с параметром, использовать здесь такой цикл нельзя (внутри цикла нельзя изменять начальное, конечное и текущее значения параметра цикла). Поэтому следует использовать цикл с пред или постусловием. Внутренний цикл, в котором определяется наличие или отсутствие отрицательных элементов в очередной строке матрицы, является циклом с заранее неизвестным числом повторений. Он должен выполняться, пока не обнаружится наличие отрицательного элемента и пока не исчерпаны элементы строки.
Согласно второму варианту формально производится не удаление строк, содержащих отрицательные элементы, а оставление в матрице строк, не содержащих нулевых элементов.
В представленной ниже программе использован метод, в котором очередная i-я строка, не содержащая отрицательных элементов, переписывается в начало матрицы на место k-ой строки, где k - количество строк без отрицательных элементов на данный момент времени, включая найденную, если i>k, иначе - остаётся на месте.
Фрагмент программы имеет следующий вид.
. . . . . . . . .
K:=0;
for I:=1 to M do
begin
Pr:=true; // отрицательных элементов нет
J:=1;
while Pr and (J<=N) do
if B[I,J]<0 then
Pr:=false
else
J:=J+1;
if Pr and (I>K+1) then
begin
K:=K+1;
for J:=1 to N do
B[K,J]:=B[I,J];
end;
end;
if K>0 then
begin
WriteLn('Полученная матрица');
for I:=1 to K do
begin
for J:=1 to N do
Write(B[I,J]:6:1,' ');
WriteLn;
end;
end
else
WriteLn('Полученная матрица пустая');
. . . . .
Пример 3 выполнения задания на матрицы
В инженерной деятельности часто приходится заниматься умножением матриц. Напомним, что очередной элемент результирующей матрицы C вычисляется согласно следующей формуле:
Cij = ,
где A,B умножаемые матрицы,
i, j – индексы очередного элемента матрицы C,
n – количество столбцов первой матрицы (строк второй матрицы).
Перемножение матриц возможно только в том случае, если количество столбцов первой матрицы равно количеству строк второй матрицы. Рассматриваемый пример интересен тем, что умножение матриц приводит к необходимости программирования тройного цикла. Это связано с тем, что один элемент, представляющий собой сумму попарных произведений соответствующих элементов исходных матриц, вычисляется в цикле, а вычисление всех элементов матрицы требует организации еще вложенного цикла. Следующий фрагмент программы демонстрирует решение рассмотренной задачи для матриц A(m,n), B(n,n2), m10, n8, n212.
Program matr3;
{$APPTYPE CONSOLE}
uses
SysUtils;
const
Mm=10;Nn=8; Nn2=12;
type
matr1=array[1..Mm,1..Nn] of Real;
matr2=array[1..Nn,1..Nn2] of Real;
matrres=array[1..Mm,1..Nn2] of Real;
var A:matr1;B:matr2;C:matrres;
I,J,M1,N1,M2,N2,K:Integer;
S:Real;
....................
begin
//ввод m1,n1, m2, n2 и матриц A и B
....................
if N1<>M2 then
WriteLn('Умножение матриц невозможно')
else
begin
for I:=1 to M1 do
for J:=1 to N2 do
begin
S:=0;
for K:=1 to N do
S:=S+A[I,K]*b[K,J];
C[I,J]:=S;
end;
//вывод матрицы С
....................
end;
ReadLn;
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.