Массивы
| English | Русский |
|---|---|
| array/əˈreɪ/ | массив (array) |
| element/ˈelɪmənt/ | элемента |
| index/ˈɪndeks/ | индекс |
| lower bound/ˈləʊə baʊnd/ | нижняя граница |
| upper bound/ˈʌpə baʊnd/ | верхняя граница |
| dimension/daɪˈmenʃn/ | размерность |
| nested loops/ˈnestɪd luːps/ | вложенных циклов |
| linear search/ˈlɪnɪə sɜːtʃ/ | линейный поиск |
| bubble sort/ˈbʌbl sɔːt/ | пузырьковая сортировка |
Место 14C
- В кинотеатре 300 мест. Система бронирования не использует 300 переменных с именами
Seat1A,Seat1B,Seat1C. Она использует один массив, а ваш билет — это адрес внутри него: ряд 14, место C. - Одно имя, сотни значений, каждое находится по номеру. Добавьте ряд, и код не изменится; пройдите циклом по номерам, и вы проверите каждое место.
- Почти каждый алгоритм в Paper 2 проходит по массиву: ищет в нем, суммирует, сортирует, находит максимальное значение.
- Этот урок посвящен словарю, объявлениям и четырем алгоритмам, которые требует экзаменатор в псевдокоде и словами.
Словарь терминов
- Массив — это структура данных, хранящая фиксированное количество элементов одного типа данных под одним идентификатором, каждый из которых доступен через индекс.
- Нижняя граница и верхняя граница — это первый и последний допустимые индексы. Количество элементов равно верхней границе минус нижняя граница плюс 1.
- Измерение показывает, сколько индексов нужно элементу: один для списка, два для таблицы.
- В
ThisArray[n] ← 42массив имеет одно измерение, индекс — это переменная-счетчикINTEGERn, а элемент по этому индексу получает значение42.

Один идентификатор, индекс для каждого элемента, границы с обоих концов
Массив хранит:
Массив — это упорядоченная коллекция элементов одного типа, доступных по индексу. (Запись группирует разные типы.)
Массив — это структура данных, хранящая много значений ______ типа под одним именем.
К каждому значению можно обратиться по его индексу.
DECLARE Marks : ARRAY[0:99] OF INTEGER объявляет массив из ____ элементов.
Верхняя граница минус нижняя граница плюс один: 99 − 0 + 1 = 100. Обе границы являются допустимыми индексами.
Разобранный пример: объявление массива, необходимого задаче
- Объявление требует идентификатора, границ и типа данных.
- 120 показаний, которые могут иметь десятичную дробь:
DECLARE Data : ARRAY[1:120] OF REAL - Таблица из 150 строк и двух столбцов текста:
DECLARE Names : ARRAY[1:150, 1:2] OF STRING - Если спросят о количестве, скажите:
[0:99]содержит 100 элементов, а не 99.
Какое объявление хранит таблицу из 150 строк и 2 столбцов текста?
Две размерности, каждая из которых имеет нижнюю и верхнюю границу, а также тип элементов. Второй вариант — это один длинный список; третий не имеет типа; четвёртый не имеет нижних границ.
Обработка массива 1-мерного
DECLARE Names : ARRAY[1:5] OF STRING
Names[3] ← "Cara"
FOR i ← 1 TO 5
OUTPUT Names[i]
NEXT i
- Цикл
FORот нижней границы до верхней границы посещает каждый элемент ровно один раз. - Для суммы, подсчета, максимума или минимума установите переменную-накопитель перед циклом и обновляйте её внутри.
2-мерные массивы
DECLARE Grid : ARRAY[1:3, 1:4] OF INTEGER
Grid[2, 3] ← 99 // row 2, column 3
- Первый индекс — это строка, второй — столбец. Вложенные циклы проходят все ячейки: внешний цикл по строкам, внутренний по столбцам.
- Используйте 1-D для одномерного массива и 2-D, когда данные имеют две естественные размерности, например, сетку мест или таблицу оценок по ученикам и предметам.

Grid[row, column], всегда в таком порядке
Используйте индекс [строка, столбец] для 2-D массива
2-D массив — это сетка. Grid[row, column] обращается точно к одной ячейке — измените строку и столбец, чтобы увидеть, какое значение вы получите.
В Grid[2, 3], какая ячейка будет обращена?
Первый индекс обозначает строку, второй — столбец, поэтому это строка 2, столбец 3.
Разобранный пример: линейный поиск, который может сообщить «не найдено»
- Линейный поиск проверяет каждый элемент по очереди от первого, пока не будет найден целевой элемент или не достигнут конец.
FoundAt ← -1
FOR i ← 1 TO n
IF A[i] = Target THEN
FoundAt ← i
ENDIF
NEXT i
IF FoundAt = -1 THEN
OUTPUT "Not found"
ELSE
OUTPUT "Found at ", FoundAt
ENDIF
-1никогда не может быть допустимым индексом, поэтому означает «не найдено». Инициализируйте его до цикла и проверяйте после. Поиск, который никогда не говорит «не найдено», теряет балл.
Линейный поиск находит значение путём:
Линейный поиск последовательно проверяет элементы с начала до тех пор, пока не найдёт целевой (или не достигнет конца).
Установка FoundAt в -1 перед линейным поиском позволяет программе сообщить «не найдено» после завершения цикла.
-1 никогда не является допустимым индексом, поэтому, если он не изменился после цикла, целевой элемент отсутствовал в массиве.
Наибольшее значение и его позиция
Largest ← A[1]
Position ← 1
FOR i ← 2 TO n
IF A[i] > Largest THEN
Largest ← A[i]
Position ← i
ENDIF
NEXT i
OUTPUT Largest, " at ", Position
- Начните
Largestс первого элемента, а не с 0: массив может состоять только из отрицательных чисел. - Та же форма подсчитывает или выводит непустые элементы: сравните каждый с маркером неиспользуемого значения,
""или-1, и считайте только те, что отличаются.
Сортировка пузырьком
- Сортировка пузырьком выполняет многократные проходы по массиву, сравнивая соседние пары и меняя местами те, что стоят в неправильном порядке, до тех пор, пока один проход не завершится без обменов.
- После каждого прохода наибольший неотсортированный элемент «всплывает» в конец, поэтому следующий проход можно остановить на одну позицию раньше.
REPEAT
Swapped ← FALSE
FOR Index ← 1 TO Limit - 1
IF Data[Index] > Data[Index + 1] THEN
Temp ← Data[Index]
Data[Index] ← Data[Index + 1]
Data[Index + 1] ← Temp
Swapped ← TRUE
ENDIF
NEXT Index
Limit ← Limit - 1
UNTIL Swapped = FALSE

Каждый переносит оставшееся наибольшее значение в конец
Расставьте шаги одного прохода пузырьковой сортировки и её завершения в правильном порядке.
Сбросьте флаг, выполните проход и обмен, уменьшите предел, остановитесь, если за весь проход не было ни одного обмена.
Разбор примера: где находятся метки сортировки пузырьком
- Внешний цикл повторяется, пока в проходе не произойдет ни одного обмена; флаг
Swappedсбрасывается наFALSEв начале каждого прохода и устанавливается наTRUEвнутриIF. - Трехстрочный обмен через временную переменную. Две строки теряют свое значение.
- Уменьшающийся предел, уменьшающийся на единицу с каждым проходом, так как наибольшее значение уже находится в конце.
- Простыми словами, для вопроса о пошаговой проработке: повторяйте до полной сортировки; на каждом проходе сравнивайте соседние пары; меняйте местами любую пару, стоящую в неправильном порядке; после каждого прохода наибольший неотсортированный элемент оказывается в конце.
Какие особенности приносят баллы в эффективной пузырьковой сортировке? Выберите все подходящие варианты.
Флаг, обмен через временную переменную, уменьшение предела: именно это приносит баллы. Копирование массива не является частью алгоритма.
Разбор примера: удаление и вставка
- Удалить элемент: найдите его индекс линейным поиском; переместите каждый последующий элемент на одну позицию ближе к началу, чтобы закрыть пустоту; отметьте последний элемент как неиспользуемый или уменьшите счетчик.
- Вставить в отсортированный массив: найдите первый индекс, элемент которого больше; переместите этот элемент и все последующие на одну позицию ближе к концу, начиная с последнего; сохраните новое значение в образовавшейся пустоте.
- Перемещайтесь от конца при открытии пустоты и от начала при ее закрытии, иначе вы затрете значение, которое собираетесь переместить.
Массив хранит множество элементов ОДИНАКОВОГО типа, к которым можно обратиться по индексу, тогда как запись группирует поля (возможно) РАЗЛИЧНЫХ типов, к которым можно обратиться по имени.
Двумерный массив (array) типа 2 подходит для сетки (строки × столбцы); структура (record) подходит для одного объекта, описываемого несколькими именованными полями.
Потерянные баллы
[0:99]содержит 100 элементов. Учитывайте обе границы.- Индекс — это
INTEGER; объявление требует также типа данных вместе с границами. Grid[row, column]: сначала строка. При их обмене будет читаться неверная ячейка в каждом вложенном цикле.- Обмен требует временной переменной; поиск требует пути «не найдено»; сортировка пузырьком заканчивается, когда в проходе нет обменов, а не после фиксированного количества проходов.
Вы поняли
- Массив хранит фиксированное количество одинаковых по типу элементов под одним идентификатором, доступ к которым осуществляется через индекс между нижней и верхней границей; количество = верхняя − нижняя + 1
- 1-D — это список, 2-D — таблица
[row, column], проходимая вложенными циклами; объявляйте с указанием границ и типа - линейный поиск:
FoundAt ← -1, цикл, сохранение индекса, проверка после цикла; максимальное значение: начните соA[1], сохраняйте позицию - сортировка пузырьком: проходы соседнего сравнения и обмена с использованием временной переменной, флаг
Swapped, уменьшающийся предел, до тех пор, пока в проходе не прекратятся обмены