Массивы кратко и понятно

Обновлено: 02.07.2024

Сегодня мы поговорим об одном из основополагающих понятий в программировании - о массиве.

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

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

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

Всего массивы бывают двух видов - одномерные (линейные) и двухмерные

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

Соответственно – двухмерный отличается тем, что у него два индекса, вместо одного.

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

Как заполнить данные правильно?

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

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

Что можно делать с компонентами массива?

  • Выстроить по убыванию или возрастанию (рассортировать);
  • Найти их значения;
  • Посчитать сколько компонентов подпадают под выставленные вами параметры.

При создании двух одинаковых совокупностей данных, есть возможность объединить их под именем одного их них.

Для начала работы с массивом, нужно его объявить. Как это сделать?

Допустим, C 77 подразумевает, что массив одномерен и состоит из 77 компонентов.

A 7,4 является двухмерным и визуализирован в табличной форме, насчитывающей 7 строчек, в каждой из которых по 5 ячеек.

Существуют ли какие-то ограничения при использовании одномерного массива? Да, мы можем создать и применять только 1000 компонентов. Примерно так же нас ограничивает и двухмерный массив - таблица будет представлена максимум 1000 столбиков с 1000 ячеек.v

Как правильно работать с массивами и что они могут нам дать?

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

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

Какие бывают виды компонентов, индексов и имен?

Как создать имя для массива? Для этой цели можно применить произвольный идентификатор. У нас есть условия, что название нужно начинать с T. Именно так можно будет отличать каждый конкретный идентификатор от всех прочих.

Дальнейшую часть названия составляют, беря за основу переменные, хранящиеся в самом массиве.

Какие типы компонентов вы можете встретить? Для того, чтобы создать индекс, берите целые числа, а в качестве типа будет выступать весь числовой диапазон, между первым и последним компонентами массива.

Приведем простой пример: тип 1. 777 будет значить, что созданный нами массив насчитывает 777 компонентов, где каждый из которых равен какому-либо числу от 1 до 777.

Надеемся, что мы смогли раскрыть вам основные термины и процессы при работе с массивами в программировании.

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

Одномерный массив, состоящий из 10 целых чисел, можно описать так:

var a: array [1..10] of integer;

Двумерный массив 10 × 10 может быть включен в текст программы любым из следующих описаний:

var a: array [1..10, 1..10] of integer;

var a: array [1..10] [1..10] of integer;

var a: array [1..10] of array [1..10] of integer;

Объявление массива может и не содержать указания о границах изменения индексов:

Перечень вопросов, рассматриваемых в теме: массивы, описание массивов, заполнение массивов, типовые задачи обработки массивов.

Глоссарий по теме: массив, элемент массива, размерность массива, индекс элемента массива, сортировка.

Основная литература по теме урока:

Л. Л. Босова, А. Ю. Босова. Информатика. Базовый уровень: учебник для 11 класса. — М.: БИНОМ. Лаборатория знаний, 2017

Дополнительная литература по теме урока:

- И. Г. Семакин, Т. Ю. Шеина, Л. В. Шестакова. Информатика и ИКТ. Профильный уровень: учебник для 11 класса. — М.: БИНОМ. Лаборатория знаний, 2012

- К. Ю. Поляков, Е. А. Еремин. Информатика. Углубленный уровень: учебник для 10 класса. В 2 ч. Ч. 2 — М.: БИНОМ. Лаборатория знаний, 2013

- Андреева Е. В. Программирование — это так просто, программирование — это так сложно. Современный учебник программирования. — М.: МЦНМО, 2015

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

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

Для решения этой достаточно простой задачи мы будем вынуждены ввести 20 имен переменных, что, естественно, очень неудобно. Но ведь чисел может быть гораздо больше, чем 20!

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

Массив — это поименованная совокупность однотипных элементов, упорядоченных по индексам, определяющим положение элемента в массиве.

Элемент массива — отдельная переменная, входящая в массив.

Индекс элемента массива — номер элемента в этом массиве.

Размерность массива — количество элементов, которое содержит массив.

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

Описание массивов

В языке Паскаль массивы описываются в блоке описания переменных следующим образом:

var : array [ ] of

- — описание индексации (нумерации) элементов массива. В качестве типа индекса можно использовать любые порядковые типы;

- — тип величин, непосредственно составляющих массив.

Приведем несколько примеров описаний:

  1. varday: array [1..365] of integer; — массив, состоящий из 365 целых чисел, которые пронумерованы от 1 до 365;
  2. vartem: array [0..11] of real; — массив, состоящий из 12 вещественных, пронумерованных от 0 до 11;
  3. var ocenka: array [–2..2] of char; — массив, состоящий из 5 символьных переменных с номерами от -2 до 2:
  4. const n=10; var slovo: array [1..n] of string; — n строковых величин, пронумерованных от 1 до n;

Для того, чтобы обратиться к элементу массива, нужно записать имя массива и в квадратных скобках индекс нужного элемента, например, day[100].

Рассмотрим основные приемы работы с массивами.

Заполнение одномерного массива значениями

Задать элементам массива значения мы можем:

— вводя значения с клавиатуры;

— случайным образом из некоторого диапазона;

Но какой бы способ мы ни выбрали, нам обязательно нужно организовать цикл.

Для начала договоримся, что мы имеем дело с массивом из 10 натуральных чисел (хотя тип элементов в данном случае значения не имеет).

Вывод элементов массива на экран

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

Воспользуемся вторым и третьим способами, рассмотренными выше:


Теперь перейдем к задачам обработки массивов.

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

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


Следующая группа задач очень часто встречается нам в реальной жизни. Это задача поиска в массиве. Например, поиск нужного слова в словаре, поиск времени отправления нужного поезда в расписании и т. д.

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

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

Рассмотрим несколько типовых задач, которые уже знакомы вам из курса основной школы.

Поиск в массиве элемента, удовлетворяющего некоторому условию

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

Мы построим алгоритм, идея которого следующая:


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

Поиск максимального (минимального) элемента массива

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

Введем дополнительную переменную max, которой присвоим значение, равное значению элемента массива a[1]. Теперь будем сравнивать все элементы, начиная со 2-го, с max, и если найдем больший элемент, то присвоим его значение переменной max. Конечное значение этой переменной и будет значением наибольшего элемента массива.


Поиск максимального (минимального) среди всех элементов массива, удовлетворяющих некоторому условию

Допустим, нужно найти наибольшее среди всех четных чисел, входящих в массив произвольных натуральных чисел.

Прием, которым мы воспользовались в задаче 5, здесь может привести к ошибке. Например, на первом месте в массиве будет стоять НЕЧЕТНОЕ число, которое окажется больше всех четных. Здесь переменной max лучше присвоить начальное значение, заведомо меньшее всех элементов массива. Например, если наш массив составлен из натуральных чисел, то присвоить max значение -2. Если после окончания программы значение max останется таким же, это будет означать, что в массиве нет четных чисел. Если же они будут, max изменит значение.

Сдвиг элементов массива

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

Таким образом при удалении элемента из массива мы можем получить, например, такую ситуацию. Допустим, имеется массив:


Удалим из него элемент с индексом i=4, т. е. a[1]=a[1], a[2]=a[2], a[3]=a[3], a[4]=a[5], a[5]=a[6], a[6]=a[7]. А вот для последнего элемента a[7] новое значение взять неоткуда. Он сохранит свое значение. Получим:


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

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


Сложнее обстоит дело со вставкой элемента внутрь массива. Как мы сказали, при вставке все элементы, расположенные справа от места вставки, сдвигаются вправо. Последнему же элементу сдвигаться некуда, и он пропадет. Чтобы этого не произошло, нужно увеличить размерность массива на 1. Но учесть это надо при описании массива. Второй важный момент заключается в том, что сдвиг значений мы будем производить справа налево до заявленной позиции вставки:


Реверс массива

Реверс массива — это перестановка его элементов в обратном порядке: первый элемент становится последним, а последний — первым.


Из примера видно, что местами меняются 1-й элемент с N-м, второй — с (N–1)-м и т. д. Замечаем, что сумма индексов элементов, участвующих в обмене, равна N+1, поэтому элемент с номером i должен меняться местами с (N+1–i)-м элементом.

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


Все вернулось в исходное состояние, потому что реверс выполнился дважды. Чтобы этого не произошло, нужно остановить процесс обмена на середине массива, т.е. на элементе с индексом (N div 2).


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

Сортировка — один из наиболее распространенных процессов обработки данных.

Под сортировкой массива понимают расстановку элементов массива в заданном порядке.

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

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

Существует много различных алгоритмов сортировки. Мы рассмотрим некоторые из них на примере сортировки массива целых чисел в порядке неубывания (a[i] 2 , где n — число элементов в массиве.

Там, где я тружусь, от веб-разработчиков ожидают знания PHP и JavaScript. Я, проводя собеседования, обнаружил, что достаточно задать всего один простой вопрос для того чтобы узнать о том, насколько глубоко разработчик понимает инструменты, которыми пользуется каждый день. Вот этот вопрос:

Каковы сходства и различия массивов в JavaScript и в PHP?

Одно дело — умение писать код. И совершенно другое — понимание внутренних механизмов используемых языков.


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

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

Массивы и их родной язык — C

Язык C — это не первый в истории язык программирования, но это — язык, который сильнее других повлиял на IT-индустрию. Многие разработчики учили в институтах C в качестве первого языка. И PHP, и JavaScript что-то взяли от C. В результате можно наблюдать некоторое сходство между этими языками и C, и именно анализ массивов в C позволит показать то, как далеко эти структуры данных продвинулись с 1972 года.

В C массивы строго типизированы и имеют фиксированную длину.


Выше показана пара объявлений массивов. Они могут хранить только целые числа, количество которых не превышает 10.

При работе с подобными массивами используется цикл for . Этот паттерн, без наличия реальной необходимости, копируется во многих других языках программирования:


Подобная конструкция не выглядит дикой ни в JavaScript, ни в PHP. Но именно здесь и кроется опасность.

Массивы в JavaScript

Можно представить себе, что массивы в JavaScript очень похожи на массивы в C. И правда — в JS совершенно нормально смотрятся следующие конструкции:


Однако массивы в JavaScript и в C — это разные вещи. Например, следующее, совершенно очевидно, в C невозможно:


В JavaScript массивы имеют переменную длину. Тип их содержимого не контролируется — точно так же, как и тип обычных переменных. Язык берёт на себя управление памятью, в результате длина массива способна увеличиваться или уменьшаться, а разработчик может об этом не задумываться. JavaScript-массивы, на самом деле, очень похожи на списки.

Перебор массива можно организовать, пользуясь неудачным способом, позаимствованным из C:


Однако у нас нет необходимости в использовании такого подхода к перебору JS-массивов. Например, тут имеются ненужные промежуточные переменные. В такой конструкции вполне могут возникать ошибки, причиной которых являются неопределённые или некорректные значения. Есть ли какое-то значение в элементе массива fibonacci[10] ? А если значение там есть — является ли оно целым числом?

Но в JavaScript имеются гораздо более совершенные механизмы для работы с массивами. Массивы в JS — это не просто некие простейшие структуры данных. Они, как и функции, являются объектами первого класса. У них есть методы, позволяющие адекватно решать различные задачи:


Это гораздо лучше, чем перебирать массив с помощью цикла for .


Некоторые методы массивов

Кроме того, как уже говорилось, длина массивов в JS, в отличие от длины С-массивов, не фиксирована. Это позволяет оказывать на массивы довольно интересные воздействия, влияющие на их длину. Так, можно, пользуясь методом pop , извлечь из массива последний элемент. А метод push позволяет добавить новый элемент в конец массива. Метод unshift позволяет добавить элемент в начало массива. А метод shift — извлечь первый элемент массива. Используя разные комбинации этих методов, с массивами можно работать как со стеками или очередями. Тут всё зависит от потребностей программиста.

Массивы в PHP

Массивы в PHP почти похожи на JavaScript-массивы.

Они, как и JS-массивы, отличаются переменной длиной и слабой типизацией. Поэтому может возникнуть соблазн решить, что массивы в PHP и в JS — это одно и то же.


Лямбда-функции в PHP не так красивы, как похожие функции в JS (в ES6), но этот пример, написанный на PHP, функционально эквивалентен ранее рассмотренному JS-примеру.

Здесь можно использовать и аналоги вышеописанных функций для добавления элементов в массив и извлечения их из него ( array_push , array_pop , array_shift , array_unshift ).

Но на JavaScript (как и на C) нельзя написать нечто подобное следующему (написать похожий код на JavaScript, конечно, можно, но работать это будет не так, как в PHP):


В PHP, с технической точки зрения, массивы — это хэш-таблицы или словари. В них используются пары вида ключ/значение. Ключи могут быть любыми примитивными значениями: целыми числами, числами с плавающей запятой, строками. Так как в основе PHP-массивов лежат словари, поиск значений по ключу в этих массивах отличается чрезвычайной эффективностью. А именно, временная сложность поиска составляет O(1) .

Это означает, что PHP-массивы могут с успехом выполнять роль простых поисковых таблиц:

Поиск конкретного значения в обычном массиве имеет временную сложность O(n) , так как в ходе поиска нужно проверить каждое значение, хранящееся в массиве. А в PHP легко сделать так, чтобы временная сложность такой же операции составила бы O(1) :


Конечно, что-то подобное доступно и в JavaScript, хотя тут уже надо будет прибегнуть к возможностям объектов. Но из-за этого придётся пойти на некоторые компромиссы. А именно, при работе с объектами в распоряжении разработчика не будет методов массивов вроде тех, о которых мы говорили выше.

Если продолжить разговор о PHP-массивах, то можно сказать, что их перебор организован просто и безопасно. Здесь есть возможность применить цикл for , напоминающий такой же цикл из C, но, прежде чем это сделать, стоит как следует подумать о том, зачем поступать именно так. PHP, благодаря циклам foreach , позволяет решать проблемы, характерные для массивов переменной длины, способных содержать значения разных типов:


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

Стоит отметить, что PHP-массивы отличаются от JS-массивов тем, что в PHP для выполнения некоторых операций с массивами приходится пользоваться внешними по отношению к ним функциями:


Это — функционально, но не так красиво, как в JavaScript. Если вы хотите писать код для работы с PHP-массивами, который напоминает код, используемый в JavaScript (существуют сильные аргументы в пользу такого подхода), то вам, возможно, стоит взглянуть на специализированное решение. Скажем — на класс Collection из фреймворка Laravel. Однако PHP позволяет создавать объекты, возможности которых напоминают возможности массивов (их, например, можно обрабатывать в циклах foreach ).

Если PHP — это ваш основной язык программирования — вы, привыкнув к нему, вполне можете забыть о той мощи, которая таится в его фундаментальных механизмах.

PHP-массивы — это, в двух словах, самая недооценённая и самая незаметная возможность языка, которая, если ей правильно пользоваться, способна принести огромную пользу.

Итоги: вопрос и ответ

Вопрос: Каковы сходства и различия массивов в JavaScript и в PHP?

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

Читайте также: