Раздел «Язык Си».PythonList2:

Задача

Дана матрица 3х3. Нужно научиться с ней работать.

Эту матрицу мы зададим в файле data.txt:

4 7 9
1 6 8
3 2 0

Повторяем для 1 строк

Если переменная а0 - это список из 3 чисел, то к этим числам обращаемся a[0], a[1], a[2]

код что делает
print(a0) печатает [4, 7, 9] - весь список
print(a0[1]) печатает число 7
a0[1] = 100 вместо 7 стало число 100
print(a0[1]) печатает число 100
print(a0) печатает [4, 100, 9] - весь список

Чтение и печать списка

Будем читать, печатать и вычислять сумму только для первой строки чисел 4 7 9

a0 = list(map(int, input().split()))   # читаем строку чисел
print(a0)                              # [4, 7, 9] - печать списка чисел

# печать элементов списка по одному
print(a0[0])                           # 4
print(a0[1])                           # 7
print(a0[2])                           # 9

# печать элементов списка по одному в цикле, col изменяется от 0 до 2
for col in range(3):
   print(f'col={col}, a0[col]={a0[col]}')

# так мы можем изменять элемент списка
#a0[1] = 100         # вместо 7 в a0[1] теперь 100
#print(a0)           # [4, 100, 9] - печать списка

Найдем сумму элементов списка

Напишем таблицу значений переменных

i a0[i] res
4 4
1 7 11
2 9 20

Выпишем формулу для вычисления res

res = res + a0[i]

Допишем код:

# сумма элементов списка
res = 0
for i in range(3):
   res = res + a0[i]
   print(f'i={i}, a0[i]={a0[i]} res={res}')

Запустим программу. Она напечатает

i=0, a0[i]=4 res=4
i=1, a0[i]=7 res=11
i=2, a0[i]=9 res=20

Список - это одна строка (row). В строке изменяется номер столбца (column). Будем обозначать номер столбца не переменной i, а переменной col.

Тогда код для чтения, печати и для суммирования с использованием переменной col.

a0 = list(map(int, input().split()))
print(a0)

print(a0[0])
print(a0[1])
print(a0[2])

for col in range(3):
   print(f'col={col}, a0[col]={a0[col]}')

#a0[1] = 100         # 7 -> 100
#print(a0)

res = 0
for col in range(3):
   res = res + a0[col]
   print(f'col={col}, a0[col]={a0[col]} res={res}')

Матрицы

Пусть дана матрица 3х3. У матрицы есть строки (rows) и столбцы (columns).

Сделали матрицу в коде

Матрица - это список списков. Ее можно задать прямо в коде:

a = [[4, 7, 9], [1, 6, 8], [3, 2, 0]]

или тот же код, который мы пишем красиво:

a = [
    [4, 7, 9], 
    [1, 6, 8], 
    [3, 2, 0]
]

Печать матрицы

Печать всей матрицы - это просто

print(a)
получим
[[4, 7, 9], [1, 6, 8], [3, 2, 0]]

Хотим напечатать красиво

print(a[0])
print(a[1])
print(a[2])
получим
[4, 7, 9]
[1, 6, 8]
[3, 2, 0]

Уже лучше. Но лучше сделаем это в цикле. Изменяться в цикле будет номер строки row от 0 до 2:

for row in range(3):
    print(a[row])

У нас есть код печати одного списка (одной строки), возьмем его и напишем вместо print(a[row]):

for row in range(3):
    for col in range(3):
        print(f'row={row} col={col} a[row][col]={a[row][col]}')

row=0 col=0 a[row][col]=4
row=0 col=1 a[row][col]=7
row=0 col=2 a[row][col]=9
row=1 col=0 a[row][col]=1
row=1 col=1 a[row][col]=6
row=1 col=2 a[row][col]=8
row=2 col=0 a[row][col]=3
row=2 col=1 a[row][col]=2
row=2 col=2 a[row][col]=0

Оставим только печать чисел a[row][col]

for row in range(3):
    for col in range(3):
        print(a[row][col])
получим
4
7
9
1
6
8
3
2
0

У нас лишний раз переводится строка после каждого числа. Можно после каждого числа печатать пробел, а не переводить строку:

for row in range(3):
    for col in range(3):
        print(a[row][col], end=' ') # end=' ' - в конце печатать пробел, а не переводить строку
получим
4 7 9 1 6 8 3 2 0

Почти идеально. Добавим в конце печати каждой строки перевод строки (напечатаем пустую строку)

for row in range(3):
    for col in range(3):
        print(a[row][col], end=' ') # end=' ' - в конце печатать пробел, а не переводить строку
    print('')                       # закончили печать очередной строки - новая строка
получим
4 7 9 
1 6 8 
3 2 0 

Чтение матрицы

Читаем матрицу на n строк так (объяснения как это работает - на следующих уроках):

n = 3 # сейчас мы знаем, что у нас будут 3 строки
# читаем матрицу из n строк
a = [list(map(int, input().split())) for i in range(n)]

Сумма всех элементов матрицы

n = 3
'''
a0 = list(map(int, input().split()))
print(a0)

print(a0[0])
print(a0[1])
print(a0[2])

for i in range(3):
   print(f'i={i}, a0[i]={a0[i]}')

#a0[1] = 100         # 7 -> 100
#print(a0)

res = 0
for i in range(3):
   res = res + a0[i]
   print(f'i={i}, a0[i]={a0[i]} res={res}')
'''
# читаем матрицу из n строк
a = [list(map(int, input().split())) for i in range(n)]

print(a)
print('---')
for row in range(3):
   print(a[row])

print('---')
print('row col a[row][col]')
for row in range(3):
   for col in range(3):
      print(row, col, a[row][col])

print('---')
for row in range(3):
   for col in range(3):
      print(a[row][col], end=' ')
   print()                     # print new line

# sum row 0
def sum_row(a, row):
   """ Считает сумму чисел в матрице а на строке row и возвращает эту сумму"""
   res = 0
   for col in range(3):
      res = res + a[row][col]
      print(f'col={col}, a[row][col]={a[row][col]} res={res}')
   return res

# x = sin(3.14)

res0 = sum_row(a,row=0)
print('res0 =', res0)

res1 = sum_row(a,row=1) 
print('res1 =', res1)

res2 = sum_row(a,row=2) 
print('res2 =', res2)

print('---')
res_total = 0
for row in range(3):
   res_row = sum_row(a, row=row)
   res_total = res_total + res_row
   print(f'SUM ROW: row={row} res_row={res_row} res_total={res_total}')

print('---')
# sum all matrix
res_total = 0
for row in range(3):
   res_row = 0
   for col in range(3):
      res_row = res_row + a[row][col]
      print(f'row={row} col={col}, a[row][col]={a[row][col]} res={res_row}')
      
   res_total = res_total + res_row
   print(f'SUM ROW: row={row} res_row={res_row} res_total={res_total}')

print('---')
# sum all matrix
res = 0
for row in range(3):      # разные магазины магазин0, магазин1, магазин2
   # res = 0            # ???
   for col in range(3):
      res = res + a[row][col]
      print(f'row={row} col={col}, a[row][col]={a[row][col]} res={res}')
      
   print(f'SUM ROW: row={row} res={res}')

-- TatyanaDerbysheva - 21 Oct 2019