1.55M
Category: programmingprogramming

Обработка двумерных массивов (тема 11)

1.

Тема 11. Обработка двумерных массивов
1. Общие сведения
Двумерный массив или матрица - это упорядоченная
последовательность величин одного типа, имеющих одно имя,
но различающихся индексами.
Каждой величине или элементу массива соответствуют два
целых числа (индекса), определяющие положение элемента в
массиве. Индексы элементов массива начинаются с нуля.
Размер матрицы определяется двумя целыми числами –
количеством строк (n) и количеством столбцов (m).
1 2 -1 4
5 6 3 -3
n=2 m=4
1

2.

Обращение к элементу массива
<имя массива> [индекс строки, индекс столбца]
Пример:
x[1, 4]
x[i, j]
Индекс Номер
строки строки
0
1
2
1
2
3
Массив х
2
6
0
Индекс столбца 0
Номер столбца 1
n=3 m=4
-1 4 5
3 -3 4
9 1 -2
1
2
2
3
3
4
2

3.

3. Ввод массива
ГСА
n – число строк
m – число столбцов
i – индекс строки
j – индекс столбца

4.

Реализация в Python
import numpy as np
n=int(input('Введите число строк '))
m=int(input('Введите число столбцов '))
x=np.zeros((n, m)) - создание матрицы из нулей размером n x m
for i in range(n):
for j in range(m):
print('Введите элемент [' , i+1 , ',' , j+1 , ']' , end=' ')
x[i, j]=float(input(''))
4

5.

3. Вывод массива
ГСА
5

6.

Реализация в Python
print ('\nИсходный массив\n')
for i in range(n):
for j in range(m):
print('% 4.1f ' % x[i,j], end=' ' )
print('\n')
6

7.

5. Типовые алгоритмы обработки двумерных массивов
5.1. Вычисление сумм, количеств, произведений элементов
матрицы, удовлетворяющих заданному условию
7

8.

9.

Пример 1. Определить количество положительных элементов,
расположенных в строках с номерами, кратными трем.
k=0
i=3
while i <= n:
for j in range(1, m+1):
if x[i-1, j-1] >0:
k += 1
i+= 3
if k == 0:
print('нет положительных элементов в строках
с номерами, кратными трем')
else:
print('Количество положительных элементов в
строках с номерами, кратными трем =',k)
9

10.

Пример 2. Вычислить произведение элементов, находящихся в
последнем столбце матрицы и больших заданного числа а.
P=1
k=0
for i in range(1, n+1):
if x[i-1, m-1] > a:
P = P * x[i-1, m-1]
k=1
if k ==0:
print(' Нет эл-в, больших a, в последнем столбце‘)
else:
print(' Произведение эл-в, больших a, в последнем
столбце =%.2f ' ,P)
10

11.

5.2. Поиск максимальных и минимальных элементов
матрицы и определение их местоположения в матрице
max – максимальный элемент матрицы
nom1 – номер строки, в которой находится максимальный
элемент
nom2 – номер столбца, в котором находится максимальный
элемент
11

12.

12

13.

Пример 3. Найти минимальный элемент среди элементов,
расположенных в столбцах с четными номерами и заменить его
суммой элементов первой строки.
min= x[0, 1]
S=0
nom1= 1
for j in range(m):
nom2= 2
S = S + x[0, j]
for i in range(1, n+1):
x[nom1-1, nom2-1] = S
j=2
< вывод x >
while j <= m:
if x[i-1, j-1] < min:
min = x[i-1, j-1]
nom1 = i
nom2 = j
j=j+2
13

14.

Пример 4. Найти максимальный элемент пятого столбца
и номер строки, в которой он находится.
max = x [0, 4]
nom_str = 1
for i in range (1,n):
if x[i, 4] > max:
max = x[i, 4]
nom_str = i+1
<вывод max, nom_str>
14

15.

5.3. Выполнение
вычислений в
каждой строке
(столбце) матрицы
Пример 5. Найти
максимальный
элемент в каждой
строке матрицы и
вычислить сумму
этих максимальных
элементов.
i – номер строки
j – номер столбца
15

16.

S=0
for i in range(1, n+1):
max= x[i-1,0]
for j in range(2, m+1):
if x[i-1, j-1] > max:
max = x[i-1, j-1]
S+=max
print('\nСумма максимумов строк',S)
i – индекс строки
j – индекс столбца
for i in range(n):
max= x[i,0]
for j in range(1, m):
if x[i, j] > max:
max = x[i, j]
16

17.

Пример 6.
В каждом столбце
матрицы
найти
сумму квадратов
элементов, а затем
вычислить
произведение этих
сумм.
i – индекс строки
j – индекс столбца
17

18.

P=1
for j in range(m):
S=0
for i in range(n):
S+=x[i,j]
P*=S
print('\nПроизведение сумм столбцов',P)
18

19.

Замечания:
1. Если вычисляется одно значение переменной (сумма,
произведение, максимум) для всей матрицы, то ее начальное
значение устанавливается перед внешним циклом, а результат
выводится после завершения внешнего цикла.
2. Если вычисляется значение переменной для каждой
строки или каждого столбца, то начальное значение
устанавливается внутри внешнего цикла перед внутренним, а
результат выводится или используется после завершения
внутреннего цикла внутри внешнего.
3. Если нужно вычислить значение переменной для каждой
строки, то внешний цикл организуется по номеру строки, если
для каждого столбца, то по номеру столбца.
4. Если значение переменной вычисляется для одной строки
или одного столбца, то вложенные циклы не нужны.
Организуется один цикл по номеру столбца или номеру строки
соответственно.
19

20.

6. Программирование циклов с досрочным завершением
Задачи обработки массивов, использующие циклы с
досрочным
завершением,
обычно
имеют
следующие
формулировки:
1. Определить есть ли в массиве элемент или группа
элементов, удовлетворяющих заданному условию.
2. Определить место первого элемента или группы элементов,
удовлетворяющих заданному условию.
3. Определить, все ли элементы или группы элементов
удовлетворяют заданному условию.
20

21.

При решении таких задач могут возникнуть ситуации,
определенные исходным массивом, при которых нет
необходимости просматривать весь массив полностью, т.к. в
первом и втором случае, найден элемент или группа элементов,
удовлетворяющих заданному условию, а в третьем случае
найден элемент или группа элементов, не удовлетворяющих
заданному условию.
Если в массиве не нужно просматривать все элементы,
строки или столбцы, следовательно, нужно завершить цикл
просмотра
элементов
при
выполнении
некоторого
дополнительного условия.
Дополнительное условие включается в условие цикла,
оно содержит второй параметр цикла.
Параметр цикла – это переменная, значение которой
изменяется в теле цикла и от которой зависит число повторений
21
цикла, т.к. она входит в условие цикла.

22.

Для
программирования
таких
алгоритмов
всегда
используется оператор цикла while, т.к. число повторений цикла
нельзя определить до начала цикла, оно зависит от элементов
массива.
Пример 7. Определить, есть ли в одномерном массиве
положительные числа, и если они есть, то определить номер
первого положительного числа. (слайд 37 – ГСА)
k=0
i=1
# номер элемента
while i <= n and k == 0:
if x[i-1] > 0: k = i
i += 1
if k==0 :
…………
else:
…………
22

23.

23

24.

Пример 8.
Определить, есть ли
в матрице хотя бы 2
нуля.
24

25.

k=0
i=1
while i <= n and k<2:
j=1
while j <= m and k<2:
if x[i-1,j-1] == 0: k = k+1
j+=1
i+=1
if k <2:
print('в матрице меньше двух нулей')
else:
print('в матрице два или больше нулей')
25

26.

Пример 9. Определить, все ли элементы матрицы больше
заданного числа z.
k=0
i=0
# индекс строки
while i <= n-1 and k == 0:
j=0 # индекс столбца
while j <= m-1 and k == 0:
if x[i, j] <= z: k = 1
j +=1
i +=1
if k == 0:
print('все элементы больше z')
else:
print(' не все элементы больше z')
26

27.

Использование логических переменных в циклах с
досрочным завершением.
Логические переменные могут принимать только одно из
двух значений True (истина) или False (ложь). Для их
описания используется тип bool. В памяти эти переменные
занимают 1 байт.
Использование переменных целого и логического типов,
соответственно:
k= 0
f= True
if k == 0: ……
if f == True: …… (if f: ….)
if k == 1: ……
if f == False: …… (if not f: ….)
while i <= n and k == 0:
…………..
while i <= n and f :
………….. (f == True)
27

28.

Пример 10. Определить, является ли одномерный массив
упорядоченным по не убыванию.
Массив упорядочен, если для всех i=0..n - 2 выполняется
соотношение между элементами массива:
xi < xi+1
- по возрастанию
xi <= xi+1 - по не убыванию
xi > xi+1
- по убыванию
xi >= xi+1 - по не возрастанию
28

29.

f = True
i=0
while i <= n-2 and f == True:
if x[i] <=x[i+1]: i += 1
else: f=False
if f==True:
…….
else:
……..
29

30.

Пример 11.
Определить, есть
ли в матрице
столбец, в котором
все элементы
положительные.
30

31.

k=0
j=1
while j <= m and k==0:
f=True
i=1
while i <= n and f:
if x[i-1,j-1] <= 0: f=False
i+=1
if f: k=1
j+=1
if k ==0:
print('в матрице нет столбцов из положит. элементов')
else:
print('в матрице есть столбец из положит. элементов')
31
English     Русский Rules