- •4.114 4. Организация программ со структурой вложенных циклов
- •4. Организация программ со структурой вложенных циклов
- •Вычисление определенного интеграла с заданной точностью
- •Задания 4.1 для самостоятельной проработки
- •Вычисление наибольшего (наименьшего) значения функции с заданной точностью на заданном интервале
- •Задания 4.2 для самостоятельной проработки
- •Обработка матриц
- •Пример 1 выполнения задания на обработку матрицы
- •Пример 2 выполнения задания на обработку матрицы
- •Пример 3 выполнения задания на матрицы
- •Пример 4 выполнения задания на обработку квадратной матрицы
- •Задания 4.3 для самостоятельной проработки
Пример 1 выполнения задания на обработку матрицы
В матрице A(m,n), m12, n10, поменять местами строки с наибольшей и наименьшей суммами элементов.
Для решения поставленной задачи необходимо вычислить суммы элементов каждой строки матрицы, однако не требуется запоминать все вычисленные суммы. Поэтому после вычисления суммы элементов очередной строки матрицы следует сравнить вычисленное значение с текущими значениями максимальной и минимальной сумм и изменить, в случае необходимости, текущие значения максимума и минимума на только что вычисленное, а также запомнить номер строки, для которой эта сумма минимальна или максимальна.
После нахождения номеров строк, подлежащих обмену местами выполняется собственно обмен. Поскольку строка матрицы представляет собой одномерный массив (первый индекс имеет фиксированное значение), то эта операция выполняется с использованием обычного (не вложенного цикла), при этом обмен местами ведется с использованием промежуточной простой переменной b.
program Matr1;
{$APPTYPE CONSOLE}
uses
SysUtils;
const
Mm=12; Nn=10;
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
begin
S:=0; //Задание начального значение суммы
//Цикл вычисления суммы элементов очередной строки
for J:=1 to N do
S:=S+A[I,J];
if S>Smax then
begin
Smax:=S;
Imax:=I;
end
else
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;
var
A:matr; S,Smax,Smin:Real; B:mas;
.................
B:=A[Imin];
A[Imin]:=A[Imax];
A[Imax]:=B;
..............
