Обработка одномерных массивов целых чисел на языке Python - Урок информатики для 9 класса
💻 Информатика 9 класс

Обработка одномерных массивов целых чисел на языке Python

Привет! Сегодня мы погружаемся в одну из самых полезных тем программирования — работу с массивами. Представь, что у тебя есть список друзей в мессенджере, плейлист любимых треков или таблица рекордов в игре. Всё это — массивы данных. И сейчас ты узнаешь, как с ними работать на Python, чтобы создавать по-настоящему крутые программы!

Массивы — это как организованные списки данных

Что такое массив и зачем он нужен?

До сих пор мы создавали программы, где каждая переменная получала своё уникальное имя: score1, score2, score3... Но что, если нужно сохранить 100 результатов игры? Или 1000? Создавать тысячу переменных — это безумие!

Именно здесь на сцену выходят структуры данных. Одна из самых важных — это массив.

💡 Определение

Массив — это набор элементов одного типа, которым присвоено общее имя. Каждый элемент массива имеет свой номер (индекс).

🎮 Пример из жизни

Ты создаёшь команду для онлайн-игры и сохраняешь никнеймы игроков. Вместо:

player1 = "DragonSlayer"
player2 = "NinjaKid"
player3 = "ProGamer"

Ты используешь массив:

players = ["DragonSlayer", "NinjaKid", "ProGamer"]

Круто же? Один объект вместо трёх!

Каждый элемент массива имеет свой индекс

Каждый элемент массива имеет свой индекс — адрес, по которому к нему можно обратиться

Размерность массива

Размерность массива — это количество индексов, необходимое для доступа к элементу.

📝 Одномерный массив

С одним индексом — как список песен в плейлисте

songs = ["Song1", "Song2", "Song3"]

📊 Двумерный массив

С двумя индексами — как таблица результатов или игровое поле в шахматах

table = [[1, 2], [3, 4]]

🐍 Python и массивы

Важно! В Python нет "настоящих" массивов в классическом понимании. Вместо них используются списки (list) — более гибкая структура. Но для простоты мы будем называть их массивами, помня, что говорим о списках.

1. Обращение к элементу массива

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

⚠️ Очень важно!

Нумерация элементов массива в Python всегда начинается с нуля.

Пример одномерного массива

A = [-15, -20, -12, -4, -2, 0, 0, 1]
Индекс 0 1 2 3 4 5 6 7
Значение -15 -20 -12 -4 -2 0 0 1

Как это читать:

  • A[0] = -15 — "значение элемента массива A с индексом 0 равно -15"
  • A[1] = -20
  • A[4] = -2

🔢 Индекс может быть переменной

i = 1
print(A[4*i-2])  # A[2] = -12

🎯 Индекс может быть значением массива

print(A[A[6]])  # A[0] = -15

📏 Длина массива

Количество элементов массива определяется функцией len():

N = len(A)  # N = 8

Как правило, длину массива хранят в отдельной переменной:

N = 8

2. Заполнение массива

Перед использованием массив необходимо создать. Обращение к несуществующему элементу вызовет ошибку и аварийное завершение программы.

Три способа заполнения массива

Три способа заполнения массива: ввод с клавиатуры, вычисление по формуле и случайная генерация

Способ 1: Перечисление элементов

Создать массив можно перечислением элементов через запятую в квадратных скобках:

A = [1, 2, -3, 5, 7]

С помощью записи A = [0]*5 будет создан массив из пяти элементов, каждый из которых равен 0.

Способ 2: Ввод с клавиатуры

Небольшие массивы можно вводить с клавиатуры. Для этого используется цикл с параметром:

N = 5
A = [0]*N
for i in range(N):
    A[i] = int(input())

Чтобы перед вводом появлялась подсказка с индексом:

for i in range(N):
    print("A[{}]=".format(i), end="\n")
    A[i] = int(input())

Способ 3: Задание значений по формуле

Задавать значения элементов массива можно по формуле:

for i in range(N):
    A[i] = 2 * i

❓ Какие значения будут присвоены элементам массива A?

Подумай и проверь на компьютере!

Способ 4: Случайные числа

Для работы со случайными числами нужно подключить функцию randint:

from random import randint

Далее можно использовать цикл с параметром:

for i in range(N):
    A[i] = randint(10, 110)

Массив A из N элементов будет заполнен случайными числами из отрезка [10, 110].

3. Вывод массива

Во многих случаях бывает полезно вывести значения элементов массива на экран. Например, если значения массива генерировались случайным образом, необходимо знать, каков исходный массив.

Результат работы программы

Результат работы программы: массив создан, заполнен случайными числами и выведен на экран

Способ 1: Вывод как единого объекта

Самый простой способ — вывести массив как один объект:

print(A)

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

Способ 2: Вывод в строку

Можно вывести элементы массива на экран в строку:

for i in range(len(A)):
    print(A[i], end=" ")

Параметр end определяет, что после вывода каждого элемента добавляется пробел.

Способ 3: Вывод в столбик

Значения элементов массива можно вывести в столбик:

for i in range(len(A)):
    print(A[i])

Способ 4: Вывод с комментариями

Более наглядный вариант — вывод с комментариями:

for i in range(N):
    print('A[',i,']=', A[i])

📝 Полная программа создания и вывода массива

N = 10                        # Создание массива
A = [0]*N

from random import randint    # Подключение генератора 
                              # случайных чисел

for i in range(N):            # Заполнение массива
    A[i] = randint(0, 99)
    
for i in range(N):            # Вывод массива
    print('A[',i,']=', A[i])

💻 Выполните эту программу на компьютере!

4. Вычисление суммы элементов массива

Пример 1: Подсчёт жителей населённого пункта

В некотором населённом пункте N домов. Известно, сколько людей проживает в каждом из домов. Составим алгоритм подсчёта числа жителей населённого пункта.

Исходные данные: одномерный массив A, содержащий N элементов:

  • A[0] — число жильцов дома 1
  • A[1] — число жильцов дома 2
  • A[N-1] — число жильцов дома N
Блок-схема алгоритма подсчёта суммы

Блок-схема алгоритма подсчёта числа жителей

💡 Принцип суммирования

Суммирование элементов массива осуществляется по тому же принципу, что и суммирование значений простых переменных: за счёт поочерёдного добавления слагаемых.

Таблица изменения значений

Значение i Операция присваивания Текущее значение s
s = 0 0
0 s = s + A[0] 0 + A[0]
1 s = s + A[1] 0 + A[0] + A[1]
2 s = s + A[2] 0 + A[0] + A[1] + A[2]
... ... ...
N-1 s = s + A[N-1] 0 + A[0] + A[1] + ... + A[N-1]

📝 Полная программа суммирования

N = 10                        # Создание массива
A = [0]*N

from random import randint    # Подключение генератора
                              # случайных чисел

for i in range(N):            # Заполнение массива
    A[i] = randint(50, 200)
    
for i in range(N):            # Вывод массива
    print('A[',i,']=', A[i])

s = 0                         # Вычисление суммы
for i in range(N):            # элементов массива
    s += A[i]
    
print('s=', s)                # Вывод результата

Рассмотрим работу алгоритма для массива

A = [100, 120, 130, 80, 70]
Значение i Операция присваивания Текущее значение s
s = 0 0
i = 0 s += A[0] 100
i = 1 s += A[1] 220
i = 2 s += A[2] 350
i = 3 s += A[3] 430
i = 4 s += A[4] 500
Суммирование элементов массива

Суммирование элементов массива — как подсчёт всех жителей в посёлке

✏️ Задание для размышления

💻 Выполните программу на компьютере, считая число жильцов дома случайным числом из диапазона от 50 до 200 человек, а число домов N = 30.

🤔 Вы уже составляли программу, получавшую на вход количество чисел N и последовательности, а затем сами эти числа и вычисляющую сумму введённых чисел. Воспроизведите эту программу. Сравните её с программой суммирования элементов массива с точки зрения процессов, происходящих в памяти. Что у них общее? В чём отличие? Обсудите этот вопрос в группе.

5. Последовательный поиск в массиве

В программировании поиск — одна из наиболее часто встречающихся задач невычислительного характера.

🎯Типовые задачи поиска

  1. Найти наибольший (наименьший) элемент массива
  2. Найти элемент массива, значение которого равно заданному значению
  3. Найти количество (сумму) элементов массива, удовлетворяющих заданному условию

Для решения таких задач в программе необходимо организовать последовательный просмотр элементов массива и сравнение значения очередного просматриваемого элемента с неким образцом.

Последовательный поиск элемента

Последовательный поиск элемента — как поиск нужного трека в плейлисте

Задача 1: Поиск наибольшего элемента

💭 Идея алгоритма (метод карточек)

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

  1. Возьмём верхнюю карточку (первый элемент массива), запомним имеющееся на карточке число (запишем его мелом на доске) как наибольшее из просмотренных; уберём карточку в сторону
  2. Возьмём следующую карточку; сравним числа, записанные на карточке и на доске; если число на карточке больше, то сотрём число, записанное на доске, и запишем там то же число, что и на карточке; если же новое число не больше, то на доске оставим имеющуюся запись; уберём карточку в сторону
  3. Повторим действия, описанные в п. 2, для всех оставшихся карточек в стопке

В итоге на доске будет записано самое большое значение элемента просмотренного массива.

🔄 Инвариант цикла

Инвариант цикла — логическое выражение (условие), зависящее от переменных, изменяющихся в теле цикла; оно истинно непосредственно перед началом выполнения цикла и после каждого прохода тела цикла.

Условие «записанное на доске число — самое большое из всех просмотренных до сих пор» является инвариантом цикла для рассмотренного алгоритма.

📝 Программа поиска наибольшего элемента

Так как доступ к значению элемента массива осуществляется по его индексу, то при организации поиска наибольшего элемента в одномерном массиве можно запоминать (хранить) его индекс. Обозначим искомый индекс imax.

N = 10                           # Создание массива
A = [0]*N

from random import randint       # Подключение генератора
                                 # случайных чисел

for i in range(N):               # Заполнение и вывод
    A[i] = randint(0,99)         # массива
    print('A[',i,']=',A[i])

imax = 0                         # Поиск индекса
for i in range(1,N):             # наибольшего элемента
    if A[i] > A[imax]: 
        imax = i

print('Наибольший элемент:', A[imax])  # Вывод результата

Рассмотрим работу алгоритма для массива

A = [100, 120, 130, 80, 70]
imax i A[i] > A[imax]
0 1 120 > 100 (Да)
1 2 130 > 120 (Да)
2 3 80 > 130 (Нет)
2 4 70 > 130 (Нет)
Наибольший элемент: 130

❓ Задания для размышления

  • Если в массиве несколько элементов, значения которых равны максимальному значению, то данная программа найдёт первый из них (первое вхождение). Подумайте, что следует изменить в программе, чтобы она находила последний из максимальных элементов.
  • Как следует преобразовать программу, чтобы с её помощью можно было найти минимальный элемент массива?
  • Проверьте свои предположения на компьютере.

Задача 2: Поиск элемента с заданным значением

Результатом решения задачи второго типа (нахождение элемента массива, значение которого равно заданному значению) может быть:

  • k — индекс элемента массива такой, что A[k] = x, где x — заданное число
  • Сообщение о том, что искомого элемента в массиве не обнаружено

📝 Программа поиска элемента, равного x

N = 10                           # Создание массива
A = [0]*N

from random import randint       # Подключение генератора
                                 # случайных чисел

for i in range(N):               # Заполнение и вывод
    A[i] = randint(0,99)         # массива
    print('A[',i,']=',A[i])

x = int(input('x='))             # Ввод значения x

nx = -1                          # Поиск индекса элемента,
for i in range(0,N):             # равного x
    if A[i] == x: 
        nx = i

if nx == -1:                     # Вывод результата
    print('Нет')
else:
    print('nx=', nx)

В этой программе последовательно просматриваются все элементы массива. Номер найденного элемента сохраняется в переменной nx. Начальное значение, присваиваемое этой переменной, заведомо не совпадает ни с одним из значений индексов элементов массива. Если значение переменной nx не изменилось в ходе выполнения цикла и осталось равным -1, то это означает, что в массиве нет элемента, равного x.

📝 Поиск с досрочным завершением

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

nx = -1
for i in range(N):
    if A[i] == x:
        nx = i
        break

if nx >= 0:
    print('A[{}]={}'.format(nx,x))
else:
    print('Элемент не найден')

Используя цикл с параметром, мы начали последовательный перебор элементов массива и завершим его досрочно, как только будет найдено требуемое значение. Для выхода из цикла используется оператор break.

Здесь выполнение алгоритма будет завершено (прервано) в одном из двух случаев:

  1. В массиве найден первый из элементов, равный заданному
  2. Все элементы массива просмотрены

❓ Задания

  • В чём ещё отличие первого варианта программы от второго? Запишите полные тексты двух вариантов программы. Выполните программы на компьютере.

Задача 3: Подсчёт элементов по условию

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

❓ Какое количество элементов подсчитывается?

k = 0
for i in range(10):
    if A[i]%2 == 0: 
        k += 1
print('k=', k)

Подсказка: оператор % вычисляет остаток от деления.

Задача 4: Сумма элементов по условию

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

❓ Какому условию удовлетворяют элементы?

s = 0
for i in range(10):
    if A[i]%2 == 0 and A[i]%10 == 4: 
        s += A[i]
print('s=', s)

Подсказка: какие числа одновременно чётные И оканчиваются на 4?

💻 Задание

Запишите полные тексты двух программ и выполните их на компьютере.

6. Сортировка массива

Под сортировкой (упорядочением) массива понимают перераспределение его элементов в некотором определённом порядке.

⬆️ Неубывающий порядок

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

Пример: [1, 2, 3, 5, 5, 7, 9]

⬇️ Невозрастающий порядок

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

Пример: [9, 7, 5, 5, 3, 2, 1]

🎯 Цель сортировки

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

Сортировка выбором

Сортировка выбором — поэтапная перестановка элементов от большего к меньшему

Алгоритм сортировки выбором

Сортировка выбором (например, по невозрастанию) осуществляется следующим образом:

  1. В массиве выбирается максимальный элемент
  2. Максимальный и первый элементы меняются местами, после чего первый элемент считается отсортированным
  3. В неотсортированной части массива снова выбирается максимальный элемент; он и первый неотсортированный элемент массива меняются местами
  4. Действия, описанные в п. 3, повторяются с неотсортированными элементами массива до тех пор, пока не останется один неотсортированный элемент (его значение будет минимальным)

Пример сортировки массива [0, 1, 9, 2, 4, 3, 6, 5]

Индекс 0 1 2 3 4 5 6 7
Значение 0 1 9 2 4 3 6 5
Шаги 1 0 1 9 2 4 3 6 5
2 9 1 0 2 4 3 6 5
3 9 6 0 2 4 3 1 5
4 9 6 5 2 4 3 1 0
5 9 6 5 4 2 3 1 0
6 9 6 5 4 3 2 1 0
7 9 6 5 4 3 2 1 0
Итог: 9 6 5 4 3 2 1 0

❓ Вопрос

В этом массиве из 8 элементов операцию выбора максимального элемента мы проводили 7 раз. В массиве из N элементов такая операция будет проводиться N - 1 раз. Объясните почему.

📝 Программа сортировки выбором

Приведём фрагмент программы, реализующий описанный алгоритм:for i in range(N-1): imax = i for j in range(i+1, N): if A[j] > A[imax]: imax = j A[i], A[imax] = A[imax], A[i]

Здесь мы использовали один цикл внутри другого. Такая конструкция называется вложенным циклом.

Вложенные циклы

Вложенные циклы — мощный инструмент для сложных операций с массивами

💻 Задания

  • Запишите полный текст программы и выполните её на компьютере для рассмотренного в примере массива А.
  • Разработайте подпрограмму max для поиска максимального из двух элементов массива.
  • Модифицируйте программу сортировки выбором, использовав в ней эту подпрограмму.

7. Массивы и последовательности целых чисел

Если требуется обработать некоторое множество однотипных целочисленных данных, то в зависимости от решаемой задачи можно пойти одним из двух путей:

💾 Обработка массива

Сохранить все элементы множества в памяти компьютера как массив и организовать обработку массива.

Плюс: в памяти компьютера будут храниться все элементы рассматриваемого множества; при необходимости к любому из них можно обратиться из разных мест программы.

⚡ Обработка последовательности

Завести одну переменную, в которую последовательно считывать каждый отдельный элемент множества, и сразу же производить его обработку.

Плюс: экономичен с точки зрения использования памяти.

Минус: в памяти компьютера будет храниться единственный элемент — тот, который был введён последним; значения ранее введённых элементов будут утеряны безвозвратно.

Обработка данных в реальном времени

Обработка данных в реальном времени — когда важна каждая единица информации

Пример 2: Камера наблюдения за скоростью автомобилей

Камера наблюдения, установленная в населённом пункте, регистрирует в автоматическом режиме скорость проезжающих мимо неё автомобилей, округляя полученные значения до целых чисел. Программа, которую вам необходимо составить, получает на вход скорости проехавших N ⩽ 100 автомобилей. Программа должна анализировать скорость каждого автомобиля и один раз в сутки выводить на экран следующую информацию:

  1. Количество автомобилей, проехавших со скоростью, превышающей 60 км/ч
  2. Максимальную скорость проехавших автомобилей
  3. Количество автомобилей, проехавших с максимальной скоростью
  4. Среднюю скорость проехавших автомобилей
  5. Количество автомобилей, проехавших со скоростью ниже средней
  6. Для каждого проехавшего автомобиля его скорость и комментарий:
    • «Нарушитель», если скорость превышает 60 км/ч, но не превышает 250 км/ч
    • «Дисциплинированный водитель», если скорость от 30 до 60 км/ч
    • «Тише едешь — дальше будешь!», если скорость меньше 30 км/ч
    • «Ошибка», если значение скорости меньше 1 или больше 250

❓ Задания для размышления

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

📌 Самое главное

Давайте подведём итоги всего, что мы узнали о массивах:

Основные операции с массивами

Основные операции с массивами — универсальные инструменты программиста

Для работы с большим количеством однотипных данных используются массивы
Массив — это набор элементов одного типа с общим именем. Каждый элемент имеет свой индекс
Нумерация элементов массива в Python начинается с нуля
При обращении к элементу массива индекс записывают в квадратных скобках
Перед использованием массив необходимо создать, иначе произойдёт ошибка
Заполнять массив можно вводом с клавиатуры, по формуле или случайными числами
При заполнении и выводе массива используется цикл с параметром
Типовые алгоритмы: суммирование, поиск, сортировка
Для вычисления суммы используется переменная-накопитель с начальным значением 0
При подсчёте элементов переменная увеличивается на 1 при нахождении элемента

🤔 Проверь себя

Проверьте, как хорошо вы усвоили материал!

1. Объясните разницу между понятиями «индекс элемента массива» и «значение элемента массива»

Подсказка: Представь адрес дома (это индекс) и имя человека, который там живёт (это значение). Адрес всегда один и тот же, а жители могут меняться!

2. Может ли массив одновременно содержать целые и вещественные значения?

Для размышления: В Python списки могут хранить разные типы данных, но для учебных задач мы работаем с однотипными элементами. Почему так удобнее?

3. Для чего предназначены массивы?

Ответь простыми словами: Зачем нужны плейлисты в музыкальном приложении вместо отдельных песен?

4. Что вы можете сказать о массиве, сформированном следующим образом?

а) for i in range(10): A[i] = random.randint(-50,50)

б) for i in range(20): A[i] = i

в) for i in range(0,5): A[i] = 2 * i - 1

Задание: Запусти каждый фрагмент в голове или на бумаге — что получится в массиве?

5. Какие преимущества обеспечивает хранение длины массива в отдельной переменной?

Подумай: Что будет, если тебе нужно изменить размер массива? Где придётся поправить код?

6. Напишите два варианта программы, вычисляющей среднюю за неделю температуру воздуха

а) обработку последовательности

б) обработку массива

Исходные данные вводятся с клавиатуры.

Пример входных данных:

Введите температуру
Понедельник>>12
Вторник>>10
Среда>>16
Четверг>>18
Пятница>>17
Суббота>>16
Воскресенье>>14

Пример выходных данных:

Средняя температура за неделю>>14.71

Лайфхак: Оба варианта дадут один результат, но подумай — в каком случае ты сможешь потом найти самый жаркий день недели?

7. Дан массив из десяти целых чисел. Напишите программу подсчёта:

а) количества чётных элементов массива

б) суммы нечётных элементов массива

в) количества элементов массива, имеющих максимальное значение

Подсказка: Используй оператор % (остаток от деления) для проверки чётности!

8. В классе 20 учеников писали диктант по русскому языку. Напишите программу, подсчитывающую количество двоек, троек, четвёрок и пятёрок, полученных за диктант

Идея для усложнения: А что, если сделать программу, которая ещё и скажет, сколько процентов класса получили каждую оценку?

9. Объявлен набор в школьную баскетбольную команду. Известен рост каждого из N учеников

Составьте алгоритм подсчёта количества претендентов, имеющих шанс попасть в команду, если рост игрока команды должен быть не менее 170 см. Напишите программу, считая рост претендента в команду случайным числом из диапазона от 150 до 200 см, а число претендентов N = 50.

Твоя задача: Представь себя тренером — кого ты возьмёшь в команду?

10. В целочисленных массивах A и B содержатся длины катетов десяти прямоугольных треугольников

(A[i] — длина первого катета, B[i] — длина второго катета i-го треугольника). Напишите программу, которая по имеющимся данным определит треугольник с наибольшей площадью и выведет его номер, длины катетов и площадь. Предусмотрите случай, когда таких треугольников несколько.

Вспомни геометрию: Площадь прямоугольного треугольника = (a × b) / 2

11. Занесите информацию о десяти странах мира в массивы NAME, K, S

(NAME — название страны, K — численность населения, S — площадь страны). Напишите программу, выводящую названия стран в порядке возрастания плотности их населения.

Формула: Плотность населения = Численность / Площадь

Челлендж: Какая страна окажется первой, а какая последней?

12. Найдите информацию о таких частных случаях списка, как стек и очередь. Подготовьте короткое сообщение

Это интересно! Стек работает как стопка тарелок (последняя положенная — первая снимается), а очередь — как очередь в магазине (первый пришёл — первый ушёл). Где в жизни ты встречал эти принципы?

Решение задач с массивами

Решение задач с массивами — твой путь к мастерству программирования!

🎉 Поздравляю!

Ты только что прошёл через один из самых важных разделов программирования! Массивы — это фундамент, на котором строятся приложения, игры, социальные сети и вообще почти всё, что ты видишь в цифровом мире.

💪 Что дальше?

  • Попробуй решить все задачи из раздела "Проверь себя"
  • Придумай свою задачу с массивами (может, рейтинг игроков в твоей любимой игре?)
  • Поэкспериментируй с кодом — меняй числа, добавляй условия, ломай и чини!

Помни: Каждый великий программист когда-то впервые создал свой первый массив. Теперь это сделал и ты!

Информатика — твой билет в цифровое будущее