Обработка двумерных массивов. (Лекция 9)

Содержание

Слайд 2

09/07/2023 Определение двумерного массива. Двумерный массив (матрица) - это структурированный тип

09/07/2023

Определение двумерного массива.

Двумерный массив (матрица) - это структурированный тип данных,

представляющий собой последовательность однотипных элементов, имеющих общее имя и снабженных двумя индексами: номером строки и номером столбца .

Индекс - это выражение целого типа (integer, byte),
определяющее положение элемента в массиве.

Размерность двумерного массива - это количество строк и столбцов матрицы.

Слайд 3

09/07/2023 Например: - матрица целых чисел. - матрица символов.

09/07/2023

Например:

- матрица целых чисел.

- матрица символов.

Слайд 4

09/07/2023 Элемент матрицы обозначается следующим образом: [ , ]. Например, элемент

09/07/2023

Элемент матрицы обозначается следующим образом:
<имя массива>[ <индекс1> , <индекс2> ].


Например, элемент двумерного массива Z, расположенный во 2-й строке и 3-м столбце, будет обозначаться Z[2,3].
A[1,5] - элемент, расположенный на пересечении 1-й строки и 5-го столбца матрицы А.

Как и любая другая переменная, двумерный массив, используемый в программе, должен быть предварительно описан в соответствующих разделах.

Здесь <имя массива> - правильный идентификатор.

Слайд 5

09/07/2023 Описание двумерного массива. а) var : array [ .. ,

09/07/2023

Описание двумерного массива.

а)
var
< имя массива >: array [< нач.

значение индекса 1>..< кон. знач. инд.1>,
< нач. значение индекса 2>..< кон. знач. инд.2> ] of < тип элементов>;
Например,
var
x:array[1..10, 1..5] of integer;
В памяти компьютера будет отведено место для 50 целых чисел (200 байт).
Слайд 6

09/07/2023 б) type = array [ .. , .. ] of

09/07/2023

б) type
< имя типа > = array [< нач. значение

индекса1 > .. < кон.знач. инд.1 >,
< нач. значение индекса2 >.. < кон.знач. инд.2 >]
of < тип элементов>;
var
< имя массива >: < имя типа >;
Например,
type
matrica = array[1..10, 1..5] of integer;
var
x, y : matrica;
Слайд 7

09/07/2023 Ввод двумерного массива (матрицы). Пусть n – количество строк в

09/07/2023

Ввод двумерного массива (матрицы).

Пусть n – количество строк в матрице,
m

– количество столбцов в матрице,
X – матрица,
i – номер текущей строки,
j – номер столбца.
Слайд 8

09/07/2023 Ввод n, m i = 1 i ≤ n да

09/07/2023

Ввод n, m

i = 1

i ≤ n

да

нет

j = 1

j ≤ m

да

нет

Ввод

X[i,j]

j = j+1

i = i+1

Слайд 9

09/07/2023 Для реализации этого алгоритма на форме нужно разместить ВК Edit

09/07/2023

Для реализации этого алгоритма на форме нужно разместить ВК Edit для

ввода размерности массива и ВК StringGrid для ввода значений элементов матрицы.

Для StringGrid нужно установить значение true для опции goEditing свойства Options,

для свойства ColCount установить значение, равное максимальному количеству столбцов массива, а для свойства RowCount установить значение, равное максимальному количеству строк матрицы.

Слайд 10

09/07/2023 Если x - матрица целых чисел (например, x :array[1..20, 1..20]

09/07/2023

Если x - матрица целых чисел
(например, x :array[1..20, 1..20] of

integer;),
то в программе для ввода используем следующий фрагмент:
n:=strtoint(edit1.Text);
m:= strtoint(edit2.Text);

for i:=1 to n do
for j:=1 to m do

x[i,j]:=strtoint(stringgrid1.Cells[j-1,i-1]);

Слайд 11

09/07/2023 Если x - массив вещественных чисел (например, x : array[1..20,

09/07/2023

Если x - массив вещественных чисел
(например, x : array[1..20, 1..20]

of real;), то в программе для ввода используем следующий фрагмент:
n:=strtoint(edit1.Text);
m:= strtoint(edit2.Text);

for i:=1 to n do
for j:=1 to m do

x[i,j]:=strtofloat(stringgrid1.Cells[j-1,i-1]);

Слайд 12

09/07/2023 Для того, чтобы при изменении размерности массива автоматически менялось количество

09/07/2023

Для того, чтобы при изменении размерности массива автоматически менялось количество строк

и столбцов компонента StringGrid, нужно создать процедуры – обработчики события изменения текста в компонентах Edit1 и Edit2 двойным щелчком на этом компоненте. И набрать код:

procedure TForm1.Edit1Change(Sender: TObject);
begin
if edit1.text<>'' then
stringgrid1.RowCount:=StrToInt(edit1.text)
end;

procedure TForm1.Edit2Change(Sender: TObject);
begin
if edit2.text<>'' then
stringgrid1.ColCount:=StrToInt(edit2.text)
end;

Слайд 13

09/07/2023 Вывод двумерного массива (матрицы). i = 1 i ≤ n

09/07/2023

Вывод двумерного массива (матрицы).

i = 1

i ≤ n

да

нет

j = 1

j ≤

m

да

нет

Вывод X[i,j]

j = j+1

i = i+1

Слайд 14

09/07/2023 Для реализации этого алгоритма на форме нужно разместить ВК StringGrid

09/07/2023

Для реализации этого алгоритма на форме нужно разместить ВК StringGrid для

вывода значений элементов матрицы.

Если x - матрица целых чисел
(например, x :array[1..20, 1..20] of integer;),
то в программе для вывода используем следующий фрагмент:

Слайд 15

09/07/2023 StringGrid1.RowCount := n; StringGrid1.ColCount := m; for i:=1 to n

09/07/2023

StringGrid1.RowCount := n;
StringGrid1.ColCount := m;

for i:=1 to n do
for j:=1

to m do

stringgrid1.Cells[j-1,i-1] := intToStr(x[i,j]);

Если x - массив вещественных чисел , то в программе для вывода используем следующий фрагмент:
StringGrid1.RowCount := n;
StringGrid1.ColCount := m;

for i:=1 to n do
for j:=1 to m do

stringgrid1.Cells[j-1,i-1] := FloatToStr(x[i,j]);

Слайд 16

09/07/2023 Типовые алгоритмы обработки двумерных массивов. Вычисление суммы, произведения, количества элементов

09/07/2023

Типовые алгоритмы обработки двумерных массивов.

Вычисление суммы, произведения, количества элементов матрицы.

Поиск

максимального и минимального элементов матрицы.

Работа с частью матрицы выше (ниже) главной (или побочной) диагонали.

Слайд 17

09/07/2023 Вычисление количества элементов массива, удовлетворяющих заданному условию. K =0 I

09/07/2023

Вычисление количества элементов массива, удовлетворяющих заданному условию.

K =0

I =<нач. знач.>

I

≤ n

да

нет

j =<нач. знач.>

j ≤ m

нет

условие

да

K=K+1

j =j+<шаг.>

да

i =i+<шаг.>

Реализация в программе:
k:=0;
i:=<нач. Знач1.>;
while i<=n do
begin
j:=<нач. Знач2.>;
while j<=n do
begin
if <условие> then
k:=k+1;
j:=j+<шаг2>
end;
i:=i+<шаг1>
end;

Слайд 18

09/07/2023 Пример 1. Требуется вычислить количество неотрицательных элементов матрицы, расположенных в

09/07/2023

Пример 1. Требуется вычислить количество неотрицательных элементов матрицы, расположенных в столбцах

с четными номерами.

K =0

I= 1

I ≤ n

да

нет

j = 2

j ≤ m

нет

X[i,j]≥0

да

K=K+1

j =j+2

да

i =i+1

Слайд 19

09/07/2023 Реализация в программе: k:=0; for i:=1 to n do begin

09/07/2023

Реализация в программе:
k:=0;
for i:=1 to n do
begin
j:=

2;
while j<=m do
begin
if x[i,j]>=0 then k:=k+1;
j:=j+2
end;
end;
Слайд 20

09/07/2023 Вычисление суммы элементов массива, удовлетворяющих заданному условию. S =0 I

09/07/2023

Вычисление суммы элементов массива, удовлетворяющих заданному условию.

S =0

I =<нач. знач.1>

I

≤ n

да

нет

j =<нач. знач.2>

j ≤ m

нет

условие

да

S=S+x[i,j]

j =j+<шаг.2>

да

i =i+<шаг.1>

Реализация в программе:
S:=0;
i:=<нач. Знач1.>;
while i<=n do
begin
j:=<нач. Знач2.>;
while j<=m do
begin
if <условие> then
S:=S+x[i,j];
j:=j+<шаг2>
end;
i:=i+<шаг1>
end;

Слайд 21

09/07/2023 Пример 2. Требуется вычислить сумму элементов матрицы, принадлежащих [-2 ;

09/07/2023

Пример 2. Требуется вычислить сумму элементов матрицы, принадлежащих [-2 ; 6)

и расположенных в строках с нечетными номерами.

S =0

I= 1

I ≤ n

да

нет

j = 1

j ≤ m

нет

-2≤X[i,j]<6

да

S=S+x[i, j]

j =j+1

да

i =i+2

Слайд 22

09/07/2023 Реализация в программе: S:=0; i:=1; while i begin for j:=1

09/07/2023

Реализация в программе:
S:=0;
i:=1;
while i<=n do
begin
for j:=1 to

m do
if (x[i,j]>=-2) and (x[i,j]<6)
then S:=S+x[i,j];
i:=i+2
end;
Слайд 23

09/07/2023 Вычисление произведения элементов массива, удовлетворяющих заданному условию. P =1 I

09/07/2023

Вычисление произведения элементов массива, удовлетворяющих заданному условию.

P =1

I =<нач. знач.1>

I

≤ n

да

нет

j =<нач. знач.2>

j ≤ m

нет

условие

да

P=P*x[i,j]

j =j+<шаг.2>

да

i =i+<шаг.1>

Реализация в программе:
P:=1;
i:=<нач. Знач1.>;
while i<=n do
begin
j:=<нач. Знач2.>;
while j<=m do
begin
if <условие> then
P:=P*x[i,j];
j:=j+<шаг2>
end;
i:=i+<шаг1>
end;

Слайд 24

09/07/2023 Пример 3. Требуется вычислить произведение элементов матрицы, больщих заданного числа

09/07/2023

Пример 3. Требуется вычислить произведение элементов матрицы, больщих заданного числа А

и расположенных в строках с номерами, кратными 3.

P =1

I= 3

I ≤ n

да

нет

j = 1

j ≤ m

нет

X[i,j]>A

да

P=P*x[i, j]

j =j+1

да

i =i+3

Слайд 25

09/07/2023 Реализация в программе: P:=1; i:=3; while i begin for j:=1

09/07/2023

Реализация в программе:
P:=1;
i:=3;
while i<=n do
begin
for j:=1 to

m do
if x[i,j]>A then S:=S+x[i,j];
i:=i+3
end;
Слайд 26

09/07/2023 Пример 4. Вычислить сумму квадратов элементов матрицы, расположенных в столбцах

09/07/2023

Пример 4. Вычислить сумму квадратов элементов матрицы, расположенных в столбцах с

четными номерами и не принадлежащих [X, Z].

Например,
Пусть дана матрица

И интервал [0, 2]

Тогда искомая сумма квадратов будет следующая:
S=(-2)2+32+(-3)2+(-2)2 = 26

Слайд 27

09/07/2023

09/07/2023

Слайд 28

09/07/2023 Начало Ввод n, m A, X, Z S =0 k=0

09/07/2023

Начало

Ввод n, m
A, X, Z

S =0 k=0

I= 1

I ≤ n

да

нет

j =

2

j ≤ m

нет

A[i,j]A[i,j]>Z

да

S=S+A[i, j]2
k=1

j =j+2

да

i =i+1

Слайд 29

09/07/2023 k = 0 да нет Вывод сообщения Вывод S нет конец

09/07/2023

k = 0

да

нет

Вывод
сообщения

Вывод
S

нет

конец

Слайд 30

09/07/2023 procedure TForm1.Button1Click(Sender: TObject); var i,j,n,m,k:integer; a:array[1..30,1..30] of real; x,z,s:real; begin

09/07/2023

procedure TForm1.Button1Click(Sender: TObject);
var
i,j,n,m,k:integer;
a:array[1..30,1..30] of real;
x,z,s:real;

begin
n:=strtoint(edit1.Text);
m:= strtoint(edit2.Text);

for i:=1 to n do
for j:=1 to m do
a[i,j]:=strtofloat(stringgrid1.Cells[j-1,i-1]);

x:=StrToFloat(edit3.Text);
z:=StrToFloat(edit4.Text);

Слайд 31

09/07/2023 s:=0; k:=0; for i:=1 to n do begin j:=2; while

09/07/2023

s:=0; k:=0;

for i:=1 to n do

begin

j:=2;
while j<=m do

begin
if (a[i,j]z) then
begin
s:=s+sqr(a[i,j]); k:=1
end;
j:=j+2
end;
end;
Слайд 32

09/07/2023 if k=0 then edit5.Text:='Нет' else edit5.Text:=floattostr(s) end;

09/07/2023

if k=0 then
edit5.Text:='Нет'
else
edit5.Text:=floattostr(s)

end;

Слайд 33

09/07/2023 Использование компонента TSpinEdit для ввода размерности матрицы Размещается на странице

09/07/2023

Использование компонента TSpinEdit для ввода размерности матрицы

Размещается на странице Samples

Предназначен для

ввода/ отображения чисел.
Способен вводить только числа, а кнопки используются для изменения числа на некоторую фиксированную величину

Свойства:
Value содержит текущее значение числовой величины
MaxValue содержит максимальное значение Value

Слайд 34

09/07/2023 MinValue - минимальное значение Value EditorEnabled разрешает или запрещает использовать

09/07/2023

MinValue - минимальное значение Value
EditorEnabled разрешает или запрещает использовать редактор для

ручного ввода чисел

Text - текст , отражаемый в окне редактора

При использовании этого компонента для ввода размерности массива нужно установить следующие значения свойств:

MinValue =1
MaxValue - максимальное количество строк или столбцов

При этом для компонента StringGrid лучше установить значение 1 для свойств RowCount и ColCount

Слайд 35

09/07/2023 Для того, чтобы при изменении размерности массива автоматически менялось количество

09/07/2023

Для того, чтобы при изменении размерности массива автоматически менялось количество строк

и столбцов компонента StringGrid, нужно создать процедуры – обработчики события изменения числового значения в компонентах SpinEdit1 и SpinEdit2 двойным щелчком на этом компоненте. И набрать код:

procedure TForm1.SpinEdit1Change(Sender: TObject);
begin
if spinedit1.text='' then
spinedit1.Value:=1;
stringgrid1.RowCount:=spinedit1.Value
end;

procedure TForm1.SpinEdit2Change(Sender: TObject);
begin
if spinedit2.text='' then
spinedit2.Value:=1;
stringgrid1.ColCount:=spinedit2.Value
end;

Слайд 36

09/07/2023 Поиск максимального и минимального элементов матрицы. Введем следующие обозначения: n

09/07/2023

Поиск максимального и минимального элементов матрицы.

Введем следующие обозначения:

n – количество

строк матрицы, m – количество столбцов;

x - исходная матрица;

i - номер строки; j – номер столбца

Max - значение максимального элемента;

Ni - номер строки максимального элемента;
Nj - номер столбца максимального элемента

Слайд 37

09/07/2023 Max =x[1,1] Ni =1 Nj = 1 i = 1

09/07/2023

Max =x[1,1]

Ni =1 Nj = 1

i = 1

i ≤

n

да

нет

j = 1

j ≤ m

нет

да

x[i,j] > Max

Max =x[i,j]

Ni =i Nj = j

j = j+1

i =i+1

Слайд 38

09/07/2023 Max: =x[1,1]; Ni:=1; Nj:=1; for i:=1 to n do if

09/07/2023

Max: =x[1,1]; Ni:=1; Nj:=1;

for i:=1 to n do

if x[i,j]>Max

then
begin
Max: =x[i,j];
Ni:=i; Nj:=j;
end;

for j:=1 to m do

Слайд 39

09/07/2023 Например, для матрицы Произведение минимальных элементов строк: P = (-2)*(-3)*2

09/07/2023

Например, для матрицы

Произведение минимальных элементов строк:

P = (-2)*(-3)*2 = 12


Пример 5. Вычислить произведение минимальных элементов строк матрицы.

Выполнение вычислений в строках и столбцах матрицы.

Слайд 40

09/07/2023 Начало Ввод n, m X P=1 i = 1 i

09/07/2023

Начало

Ввод n, m
X

P=1

i = 1

i ≤ n

нет

да

Min=x[i, 1]

j= 2

j ≤ n

да

нет

x[i,j]

Min

= x[i,j]

j =j+1

да

P =P*Min

i = i+1

Слайд 41

09/07/2023 Вывод Р Конец procedure TForm1.Button1Click(Sender: TObject); var i,j,n,m:integer; x:array[1..30,1..30] of

09/07/2023

Вывод Р

Конец

procedure TForm1.Button1Click(Sender: TObject);
var
i,j,n,m:integer;
x:array[1..30,1..30] of real;
P, Min:real;

begin
n:=spinedit1.Value;

m:= spinedit2.Value;

for i:=1 to n do
for j:=1 to m do
x[i,j]:=strtofloat(stringgrid1.Cells[j-1,i-1]);

Слайд 42

09/07/2023 P:=1; for i:=1 to n do begin min:=x[i,1]; for j:=2

09/07/2023

P:=1;
for i:=1 to n do
begin
min:=x[i,1];

for j:=2 to m

do
if x[i,j]< min then min:=x[i,j];

P:=P*min
end;

Edit1.Text:=FloatToStr(P)
end;