Практикум по программированию Обработка числовых данных
.pdf5. ОРГАНИЗАЦИЯ ПРОГРАММ СО СТРУКТУРОЙ ВЛОЖЕННЫХ ЦИКЛОВ |
151 |
|
|
type
matr=array[1..Mm,1..Nn] of Real; var
A:matr;S,Smax,Smin,B:Real;
Imax,Imin,I,J,M,N:Integer;
.....................
begin
WriteLn('Введите количество строк и столбцов'); ReadLn(M,N);
WriteLn('Введите матрицу по строкам'); for I:=1 to M do
begin
for J:=1 to N do Read(A[I,J]);
ReadLn;
end;
WriteLn('Исходная матрица'); for I:=1 to M do
begin
for J:=1 to N do Write(A[I,J]:6:1,' ');
WriteLn;
end;
//Задание начальных значений Smax:=-1e30; //Очень маленькое число Smin:=1e30; //Очень большое число
//Строго говоря, самое маленькое и самое большое //значения для используемого типа данных
{
Другой вариант – нахождение суммы элементов первой строки и задание этого значения для максимума и минимума:
S:=0;
for J:=1 to N do S:=S+A[1,J]; Smax:=S; Imax:=1; Smin:=S; Imin:=1;
Далее строки можно рассматривать, начиная со второй
}
//Цикл поиска строк с максимальной и минимальной //суммами элементов
for I:=1 to M do
152 |
ПРАКТИКУМ ПО ПРОГРАММИРОВАНИЮ |
|
|
begin
S:=0; //Задание начального значения суммы //Цикл вычисления суммы элементов //очередной строки
for J:=1 to N do S:=S+A[I,J]; if S>Smax then
begin Smax:=S; Imax:=I;
end
if S<Smin then begin
Smin:=S;
Imin:=I;
end;
end;
//Цикл обмена местами найденных строк for J:=1 to N do
begin B:=A[Imin,J];
A[Imin,J]:=A[Imax,J];
A[Imax,J]:=B;
end;
WriteLn('Полученная матрица'); for I:=1 to M do
begin
for J:=1 to N do Write(A[I,J]:6:1,' ');
WriteLn;
end;
WriteLn('imin=',Imin:2,' imax=',Imax); ReadLn;
end.
Если матрицу описать как одномерный массив, элементами которого являются одномерные массивы, то обмен местами на й- денных строк может быть записан короче, без использования цикла:
type
mas=array[1..Nn] of Real; matr=array[1..Mm] of mas;
5. ОРГАНИЗАЦИЯ ПРОГРАММ СО СТРУКТУРОЙ ВЛОЖЕННЫХ ЦИКЛОВ |
153 |
|
|
var
A:matr; S,Smax,Smin:Real; B:mas;
.................
B:=A[Imin];
A[Imin]:=A[Imax];
A[Imax]:=B;
..............
2. Удалить из матрицы B(m, n), m ≤ 10, n ≤ 8 строки, содержащие отрицательные элементы. Можно предложить два вариант а решения задачи.
Если понимать условие буквально, то в случае наличия отри - цательных элементов в очередной строке матрицы следует у далить именно эту строку. Выполняется эта операция путем пе резаписи всех строк, расположенных после удаляемой, на одну строку
âсторону уменьшения номеров строк и общего количества ст рок матрицы на единицу. В ходе анализа надо учитывать, что посл е удаления очередной строки на ее место перепишется новая, которая еще не анализировалась, поэтому номер строки изменя ть не следует. Если же текущая строка не удалялась, для перехо да к следующей строке текущий номер следует увеличить на един ицу. Поскольку в этом случае изменяется количество строк, а эт а величина является конечным значением параметра цикла, то, у чи- тывая правила организации цикла с параметром, использова ть здесь такой цикл нельзя (внутри цикла нельзя изменять нач альное, конечное и текущее значения параметра цикла). Поэтому следует использовать цикл с предили постусловием. Внутр енний цикл, в котором определяется наличие или отсутствие о трицательных элементов в очередной строке матрицы, является циклом с заранее не известным числом повторений. Он должен вы - полняться, пока не обнаружен отрицательный элемент и не проверены все элементы строки.
Согласно второму варианту формально производится не уда - ление строк, содержащих отрицательные элементы, а оставле ние
âматрице строк, не содержащих отрицательных элементов.
Âпредставленной ниже программе использован метод, в котором очередная i-я строка, не содержащая отрицательных элементов, переписывается в начало матрицы на место k-й строки, где k — количество строк без отрицательных элементов на данный момент времени, включая найденную, если i > k, иначе строка остается на месте.
Фрагмент программы имеет следующий вид:
154 |
ПРАКТИКУМ ПО ПРОГРАММИРОВАНИЮ |
|
|
. . . . . . . . .
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 вычисляется согласно следующей
формуле:
n
Cij = å Aik Bkj , k =1
где A, B — умножаемые матрицы; i, j — индексы очередного элемента матрицы C; n — количество столбцов первой матрицы (строк второй матрицы).
Перемножение матриц возможно только в том случае, если количество столбцов первой матрицы равно количеству стр ок
5. ОРГАНИЗАЦИЯ ПРОГРАММ СО СТРУКТУРОЙ ВЛОЖЕННЫХ ЦИКЛОВ |
155 |
|
|
второй. Умножение матриц приводит к необходимости програ ммирования тройного цикла. Это связано с тем, что один элемент , представляющий собой сумму попарных произведений соответствующих элементов исходных матриц, определяется в ци кле, а вычисление всех элементов матрицы требует организации еще одного вложенного цикла. Следующий фрагмент программы демонстрирует решение рассматриваемой задачи для матри ц A(m, n), B(n, n2), m ≤ 10, n ≤ 8, n2 ≤ 12:
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 N1 do S:=S+A[I,K]*B[K,J];
C[I,J]:=S;
end;
//Вывод матрицы С
.. . . . .
end;
ReadLn;
end.
156 |
ПРАКТИКУМ ПО ПРОГРАММИРОВАНИЮ |
|
|
Наряду с прямоугольными матрицами часто приходится имет ь дело и с квадратными, в которых количество строк равно кол и- честву столбцов. В случае квадратных матриц часто необход имо обрабатывать элементы, расположенные в определенном мес те (на главной диагонали, на побочной, под главной диагональю и т. д.). Чтобы избежать ненужных проверок индексов элементов матрицы, целесообразно знать закон изменения индексов дл я элементов, расположенных в определенном месте. Для матрицы 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 = 1, 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.
4. В квадратной матрице F(k, k), k ≤ 9 определить, что больше — модуль минимального отрицательного элемента, стоящего над побочной диагональю, или максимальный положительный элемент, стоящий под побочной диагональю. Ниже представле н фрагмент программы:
5. ОРГАНИЗАЦИЯ ПРОГРАММ СО СТРУКТУРОЙ ВЛОЖЕННЫХ ЦИКЛОВ |
157 |
|
|
program Matr4; {$APPTYPE CONSOLE} uses
SysUtils; const
Mm=9; type
matr=array[1..Mm,1..Mm] of Real; var
F:matr;
I,J,M:Integer;
Max,Min:Real;
Pol,Otr:boolean;
....................
begin
Min:= 0; Otr:=False; for I:=1 to M-1 do for J:=1 to M-I do
if (F[I,J]<Min) then begin
Min:=F[I,J];
Otr:=True;
end;
Max:= 0; Pol:=False; for I:=2 to M do
for J:=M-I+2 to M do if (F[I,J]>Max) then begin
Max:=F[I,J];
Pol:=True;
end;
if not Otr then
WriteLn('Отрицательных элементов нет') else if not Pol then
WriteLn('Положительных элементов нет') else
begin
if Abs(Min)>Max then
WriteLn('Модуль наименьшего отрицательного ' +' больше наибольшего положительного' ,' Min=',Min:6:1,' Max=',Max:6:1);
if Abs(Min)<Max then
158 ПРАКТИКУМ ПО ПРОГРАММИРОВАНИЮ
WriteLn('Модуль наименьшего отрицательного ' +' меньше наибольшего положительного' ,' Min=',Min:6:1,' Max=',Max:6:1);
if Abs(Min)=Max then
WriteLn('Модуль наименьшего отрицательного ' +' равен наибольшему положительному' ,' Min=',Min:6:1,' Max=',Max:6:1);
end;
ReadLn;
end.
5.7.Задания для самостоятельной работы
1.Составить программу, которая в матрице A(m, n), m ≤ 10, n ≤ 12 меняет местами строку, содержащую максимальный элемент, со строкой, содержащей минимальный элемент. Предполагается, что искомые элементы единственные. Вывести исхо д- ную и преобразованную матрицы, минимальный и максимальный элементы, а также номера строк, в которых они расположе ны. Если минимальный и максимальный элементы расположены в одной строке, то поменять местами столбцы, содержащие эти элементы.
2.Составить программу, которая в каждой строке матрицы B(m, n), m ≤ 10, n ≤ 12 находит модуль суммы отрицательных элементов и сумму положительных элементов. Из найденных э лементов сформировать матрицу C(m, 3), в каждой строке которой первые два элемента — найденные суммы, а третий элемент ра - вен: минус единице, если первая сумма больше второй; нулю, если они равны; единице, если вторая сумма больше первой. Вы - вести исходную и полученную матрицы так, чтобы в каждой ст роке сначала располагалась строка исходной матрицы, а затем строка полученной.
3.Составить программу, которая в каждой строке матрицы D(m, n), m ≤ 10, n ≤ 12 находит элемент, где модуль разности этого элемента и среднего арифметического элементов стр оки минимален. Вывести исходную матрицу так, чтобы после элем ентов строки матрицы располагались найденный элемент, сред нее арифметическое и модуль их разности.
4.Составить программу, которая в матрице K(m, n), m ≤ 10, n ≤ 12 меняет местами строки, содержащие максимальное количество четных и нечетных элементов. Если во всех строка х
5. ОРГАНИЗАЦИЯ ПРОГРАММ СО СТРУКТУРОЙ ВЛОЖЕННЫХ ЦИКЛОВ |
159 |
|
|
эти количества одинаковы, то поменять местами первую и по с- леднюю строки матрицы. Вывести исходную и преобразованную матрицы, найденные количества и номера найденных строк.
5.Составить программу, которая в квадратной матрице F(m, m), m ≤ 10 находит сумму всех элементов верхней треугольной матрицы, больших всех элементов нижней. Вывести исходную мат - рицу и найденную сумму. Если верхняя треугольная матрица не содержит нужных элементов, то выдать соответствующее соо б- щение.
6.Составить программу, которая в каждой строке матрицы H(m, n), m ≤ 10, n ≤ 12 находит максимальное из произведений вида
hi1, hi1hi2, hi1hi2hi3,… ...(,hi1hi2 …...hin). Вывести исходную матрицу и рядом с каждой строкой найденное максимальное значение п ро-
изведения.
7.Составить программу, которая в каждой строке матрицы G(m, n), m ≤ 10, n ≤ 12 находит суммы элементов, расположенных до и после максимального элемента. Если сумма не может быт ь вычислена (нет элементов до или после максимального), то считать ее равной нулю. Вывести исходную матрицу, распола - гая в одной строке элементы строки матрицы, после которых вывести номер столбца максимального элемента и найденны е суммы.
8.Составить программу, которая находит в каждой строке мат - рицы S(k, l), k ≤ 12, l ≤ 15 самую длинную последовательность отрицательных чисел и произведение ее элементов. Если строк а не содержит отрицательных чисел, то считать произведение ра вным нулю. Вывести исходную матрицу, располагая в одной строке элементы строки матрицы, после которых — длину найденной пос - ледовательности и ее произведение.
9.Составить программу, которая находит в каждой строке мат - рицы P(k, l), k ≤ 12, l ≤ 14 суммы элементов с нечетными номерами столбцов и с четными. Найти максимальное значение перв ых сумм и минимальное вторых сумм. Вывести исходную матрицу, располагая в одной строке элементы строки матрицы, затем найденные суммы, максимальное и минимальное значения.
10.Составить программу, которая находит в каждой строке матрицы Q(k, l), k ≤ 12, l ≤ 14 произведение элементов, расположенных между минимальным и максимальным элементами этой строки. Если произведение вычислить нельзя (нет элементо в меж-
160 |
ПРАКТИКУМ ПО ПРОГРАММИРОВАНИЮ |
|
|
ду минимальным и максимальным), то считать его равным нулю . Вывести исходную матрицу, располагая в одной строке элеме нты строки матрицы, затем найденное произведение, минимально е и максимальное значения.
11.Составить программу, которая находит в каждой строке матрицы Q(k, l), k ≤ 12, l ≤ 14 сумму положительных элементов, расположенных между первым и последним отрицательными э лементами этой строки. Если сумму вычислить нельзя (нет поло - жительных элементов между первым и последним отрицатель - ными элементами), то считать ее равной нулю. Вывести исходную матрицу, располагая в одной строке элементы строки ма трицы, затем найденную сумму, первый и последний отрицательные э лементы.
12.Составить программу, которая находит в каждой строке матрицы Q(k, l), k ≤ 12, l ≤ 14 среднее арифметическое максимального отрицательного и минимального положительного элем ентов. Найти максимальное среднее арифметическое и номер ст роки, для которой оно получено. Если среднее вычислено быть н е может (нет отрицательных или положительных элементов в с троке), то считать его равным нулю. Вывести исходную матрицу, р асполагая в одной строке элементы строки матрицы, затем най - денные максимальное и минимальное, их среднее арифметиче с- кое. Под матрицей вывести максимальное среднее арифметич еское
èномер строки.
13.Составить программу, которая в каждой строке матрицы D(m, n), m ≤ 10, n ≤ 12 находит элементы, где сумма предшествующих элементов больше суммы последующих. Для первого элемента сумму предшествующих элементов считать равной нул ю. Для последнего элемента сумму последующих элементов счи - тать равной нулю. Вывести матрицу в виде матрицы, располаг ая рядом с каждой строкой найденные элементы.
14.Составить программу, которая в каждой строке матрицы D(m, n), m ≤ 10, n ≤ 12 находит элемент, для которого модуль разности элемента и среднего геометрического модулей всех э лементов строки максимален. Предполагается, что матрица нул е- вых элементов не содержит. Вывести матрицу в виде матрицы , располагая рядом с каждой строкой найденный элемент и модуль искомой разности.
15.Составить программу, которая в матрице D(m, n), m ≤ 10, n ≤ 12 находит все элементы, где сумма всех элементов строки,
