Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Практикум по программированию Обработка числовых данных

.pdf
Скачиваний:
562
Добавлен:
23.03.2016
Размер:
3 Мб
Скачать
☆

5. ОРГАНИЗАЦИЯ ПРОГРАММ СО СТРУКТУРОЙ ВЛОЖЕННЫХ ЦИКЛОВ

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 находит все элементы, где сумма всех элементов строки,