Массивы и циклы
- Меня зовут Андрей Гурылев, я работаю в компании
Wrike - Я организую встречи NodeSchool SPb и помогаю на pitercss и PiterJS
- Я верстаю 9 лет, сейчас зовусь Senior Frontend Developer
и, кажется, научился чему-то за эти годы - Сегодня я поделюсь подробностями о том,
как правильно работать массивами и циклами
В предыдущих сериях: массивы
Массив — это коллекция значений
В элементах массива могут содержаться значения любых типов
Массивы нумеруются с нуля
Элементы массива можно получить по числовому ключу
var animals = [«Котик», «Енот», «Лиса»];
alert( animals[0] ); // Котик
В предыдущих сериях: циклы
Цикл нужен для обхода элементов массива
Цикл while выполняется, пока переданное условие верно
var cats = 2; while( cats
Цикл for задаётся тремя выражениями: начало цикла, условие и шаг
Пока условие выполняется, цикл выполненяет своего содержимого
Доступ к элементам массива в цикле — через квадратные скобки arr [ i ] , где i — номер итерации
Многомерные массивы
Это когда массивы в массиве
var groups = [[«Пётр», «Ада»],[«Ян», «Маша», «Нат»]];
alert(groups[0]);
Методы перебора массивов
Перебор: forEach
Тот же for , только принимает функцию и даёт ей итерируемый объект
var tutors = [«Тим», «Андрей»];
tutors.forEach(function( item , i , arr ) <
alert( i + «: » + item + » (массив:» + arr + «)» );
>);
Перебор: forEach с выносом функции
var tutors = [«Тим», «Андрей»];
function getTutors( item , i , arr ) <
alert( i + «: » + item + » (массив:» + arr + «)» );
>
tutors.forEach(getTutors);
Фильтрация: filter
Когда нужно взять только часть массива. Создаётся новый массив.
var students = [«Алексей Петров», «Надежда Василькова», «Алексей Николаев»];
function findAlex(student, i, arr) <
return student.split(‘ ‘)[0] === «Алексей»
>
alert(students. filter (findAlex));
Проверить
Трансформация: map
Когда нужен новый массив, данные в котором опираются на имеющийся
var groups = [[«Пётр», «Ада»],[«Ян», «Маша», «Нат»]];
function countStudents(group, i, arr) <
return group.length
>
alert(groups. map (countStudents));
Проверить
Проверка массива: every/some
Когда нужно знать, что все элементы массива чему-то соответствуют
var students = [«Пётр 1», «Николай 2», «Костя»];
function findKings(student, i, arr) <
var secondName = student.split(‘ ‘)[1]
return secondName && !isNaN(secondName)
>
alert(students. some (findKings));
Проверить
Длина массива: length
Можно получить количество элементов массива: arr.length
Это количество можно присвоить: arr.length = 100;
Тогда массив может обрезаться или наполниться пустыми элементами
Важно понимать: длина массива равна последнему элементу + 1 var arr = [];
arr[100] = true;
alert(arr.length); // 101
Проверить
Массивы с дырами
Можно создать массив с пропущенными элементами.
Тогда пропущенные будут undefined
var arr = [];
arr[0] = 0;
arr[10] = 10;
alert(arr);
Проверить
Промежуточные результаты: reduce
Методы работы с очередью
Конец массива: pop/push
pop удаляет последний элемент массива
push добавляет элемент в конец массива
var group1 = [«Пётр 1», «Николай 2»];
var group2 = [«Сталин», «Ленин»];
var exchangeStudent = group1.pop()
group2.push(exchangeStudent)
Начало массива: shift/unshift
Та же история, что с pop и push , только в начале массива
var vkCEO = [«Дуров», «Добродеев», «Рогозов»];
var removedCEO = vkCEO.shift()
var telegramCEO = [];
telegramCEO.unshift(removedCEO)
Функции shift и unshift — медленные! Избегайте их!
Методы изменения массивов
Разделение и склейка: split/join
join нужен, чтобы соединить элементы массива строкой:
[«Андрей», «Антон», «Кирилл»].join(‘, ‘); // «Андрей, Антон, Кирилл»
split — для разделения строки на элементы массива:
«Андрей, Антон, Кирилл».split(‘, ‘); // [«Андрей»,»Антон»,»Кирилл»]
Лайфхаки split
Разделение с обрезкой: Передаём в split вторым аргументом число для обрезки нового массива до этого количества элементов
«Андрей, Антон, Кирилл».split(‘, ‘, 2);
// [«Андрей»,»Антон»]
Разделить можно не только массив, но и строку:
«Андрей».split(»); // [«А», «н», «д», «р», «е», «й»]
Удаление из массива: delete
Можно удалить любой элемент массива
var arr = [«Все», «любят», «котиков»];
delete arr[2]; // [«Все», «любят», ]
Части массивов: slice
Метод slice(start, end) позволяет взять элементы массива, начиная со start, заканчивая элементом до end
var arr = [«Почему», «надо», «любить», «котиков»]; var arr2 = arr.slice(1, 3); // [«надо, «любить»]
Можно отсчитывать элементы с конца массива
var arr3 = arr.slice(-2); // [«любить, «котиков»]
Нарезка массивов: splice
Метод splice – это универсальный раскладной нож для работы с массивами. Умеет все: удалять элементы, вставлять элементы, заменять элементы – по очереди и одновременно.
var arr = [«Я», «изучаю», «JavaScript»]; arr.splice(1, 1); // начиная с позиции 1, удалить 1 элемент alert( arr ); // осталось [«Я», «JavaScript»]
Нарезка массивов: splice
Пример со вставкой новых элементов вместо удалённых
var arr = [«Я», «сейчас», «изучаю», «JavaScript»];
arr.splice(0, 3, «Мы», «изучаем») // удалить 3 первых элемента и добавить другие вместо них
alert( arr ) // теперь [«Мы», «изучаем», «JavaScript»]
Вставка без удаления: splice
Можно вставить в любую позицию массива новые элементы без удаления старых
var arr = [«Я», «изучаю», «JavaScript»];
arr.splice(2, 0, «сложный», «язык»);
alert( arr ); // «Я», «изучаю», «сложный», «язык», «JavaScript»
Сортировка массива: sort
Можно отсортировать элементы массива в алфавитном порядке
Важно: числа будут приведены к строкам перед сортировкой
var arr = [ 1, 2, 15 ].sort();
// [ 1, 15, 2 ]
Сортировка массива по своим правилам
Сортировка массива по своим правилам
function compareNum(a, b) <
return a — b;
>
var arr = [ 1, 15, 2 ].sort(compareNum); // 1, 2, 15
Обращение порядка: reverse
Если нужно полностью зеркально поменять порядок элементов в массиве, это можно сделать функцией reverse
var arr = [1, 2, 3];
arr.reverse()
// [ 3, 2, 1 ]
Склейка массивов: concat
Можно склеивать массивы конкатом
[1, 2, 3].concat([6, 7, 9], 20, 50)
// [1, 2, 3, 6, 7, 9, 20, 50]
Важно понимать! concat создаёт новый массив!
indexOf, lastIndexOf
indexOf нужен, чтобы узнать позицию элемента в массиве
[3, 0, 8].indexOf(0) // 1
Но ещё чаще его используют для определения наличия элемента в массиве. Пишут это в проверках вот так:
if([3, 8].indexOf(0) === -1) <
// сделать что-нибудь, если элемента нет в массиве
>
C++ для начинающих

Массив — это упорядоченный набор однотипных данных, объединенных под одним именем. Массивы используются для обработки большого количества однотипных данных.
Отдельное значение в массиве называется элементом массива. Элементами массива могут быть данные любого типа. Количество элементов в массиве называется размером массива.
Каждый элемента массива имеет свой номер, который называется индексом. Индекс ячейки – это целое неотрицательное число, по которому можно обращаться к элементу массива и выполнять какие-либо действия над ним. Первый элемент массива в С++ имеет индекс ноль.
b1[0] = 10; // первому элементу массива b1 присваивается значение 10
d=m3[2] + m3[4]; // переменной d присваивается сумма элементов массива m3 c номерами 2 и 4
Количество индексов для указания элемента массива называется размерностью массива. В зависимости от количества индексов массивы делятся на одномерные (линейные) массивы, двумерные массивы (матрицы), трёхмерные массивы и так далее до n-мерного массива. Чаще всего в программировании используются одномерные и двумерные массивы.
Одномерные массивы в С++
Одномерный массив — массив с одним индексом. Наглядно массив можно представить в виде набора пронумерованных ячеек, в каждой из которых может находиться только одно значение. Иногда эти данные могут совпадать с номером ячейки. На рисунке 1 показана структура целочисленного одномерного массива A. Размер этого массива — 8.
| Индекс ( порядковый номер ячейки) | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| Элементы массива (содержимое ячейки) | 5 | -12 | 4 | 6 | 6 | -8 | 0 | 15 |
Обратите внимание, что максимальный индекс одномерного массива A равен 7, но размер массива 8, потому что нумерация ячеек массива всегда начинается с 0.
Инициализация массива
Для того чтобы использовать массивы в своих программах, его надо сначала объявить.
Синтаксис объявления одномерного массива в С++:
тип имя_массива [размер_массива];
Сначала указывается тип элементов массива. После имени массива в квадратных скобках задаётся размер одномерного массива.
Пример. Объявление одномерного массива а из 16 целых чисел. Создается пустой массив (обычно, заполненный нулями).
int — целочисленный тип данных;
а — имя одномерного массива;
16 — размер одномерного массива, 16 ячеек.
Пример. Объявление двух одномерных массивов mas и а размерами 10 и 16 соответственно. Оба массива имеют одинаковый тип данных — int .
Массивы могут быть инициализированы при объявлении. Инициализация одномерного массива выполняется в фигурных скобках после знака равно, каждый элемент массива отделяется от предыдущего запятой.
При инициализации размер массива можно не указывать. В этом случае компилятор сам определит размер одномерного массива.
Пример. Инициализация массива без определения его размера.
Обращение к элементам массива
Для обращения к элементу массива необходимо указать имя массива и номер элемента. Например, для присвоения элементу массива значения указываем имя массива и номер элемента и после знака равенства указываем присваиваемое значение.
arr[6] = 7 * 4; // arr[6] равен 28
cout << arr[10] << ", " << arr[11]; // на экран выводится значения одиннадцатого и двенадцатого элементов массива
Всегда следите, чтобы не обращаться к элементам, которые находятся за пределами массива. Если длина равна 5, а вы обратитесь к ячейке под индексом 5, 6, 7 и так далее, то результат может быть непредсказуемым.
Пример. Инициализация и вывод элементов одномерного массива.
В строке 5 объявлен и инициализирован целочисленный одномерный массив с именем m1, размером 10 элемнтов. Обработка массива осуществляется циклом for . Переменную-счётчик i используется для обращения к элементам одномерного массива m1. В условии продолжения цикла for (строка 9) стоит строгий знак неравенства, так как индекса 10 в одномерном массиве m1 нет. В теле цикла for (строка 11) оператор cout выводит элементы одномерного массива.
Рис. 2 — Результат выполнения программы
Ввод элементов массива
Пример. Программа последовательно считывает в массив 6 введённых чисел с клавиатуры. Затем вычисляет и выводит на экран сумму элементов массива.
В переменной sum будет накапливаться сумма элементов одномерного массива. Первый цикл for заполняет одномерный массив числами, введёнными с клавиатуры (строки 9 — 13). Переменная счётчик i используется для последовательного доступа к элементам одномерного массива mas, начиная с индекса 0 и до 5-го включительно. Второй цикл for (строки 15 — 16) последовательно считывает элементы одномерного массива и суммирует их.
Рис. 3 -Результат выполнения программы
Пример. Программа заполняет массив из 12 элементов случайными вещественными числами в диапазоне [-5;5] и выводит элементы массива на экран.
Пример. Программа заполняет массив из 10 элементов числами, которые вычисляются выражением bi=2i+6 . Элементы массива и выводятся на экран.
#include <iostream> using namespace std; int b[10]; int i; int main() < for(i = 0; i < 10; i++) < b[i]=2*i+6; cout << "b[" << i << "] cpp-array1_files/screen-array3.png" width="75" height="127">Рис. 5 — Результат выполнения программы
Зачем нужен цикл в массиве?
Обычно для чего используют перебор элементов в массиве?
Прошу не губить, так как я новичок.
![]()
Чтобы проходиться по массиву. Можно его изменять, например
Пример, как посчитать сумму элементов в массиве, для этого подойдёт цикл:
Пример, надо создать функцию, которая возвращает true, если в массиве есть число 5, иначе функция возвращает false:
Пример, вывести в консоль только нечетные элементы массива:
![]()
Дизайн сайта / логотип © 2023 Stack Exchange Inc; пользовательские материалы лицензированы в соответствии с CC BY-SA . rev 2023.9.6.43612
Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.
10.3 – Массивы и циклы
Рассмотрим случай, когда мы хотим найти средний балл за тест в классе студентов. Используя отдельные переменные:
Это много переменных и много набора текста – и это всего 5 студентов! Представьте, сколько работы нам нужно было бы сделать для 30 или 150 студентов.
Кроме того, если добавится новый студент, необходимо будет объявить и инициализировать новую переменную и добавить ее в расчет totalScore . Каждый раз, когда вам нужно изменить старый код, вы рискуете внести ошибки.
Использование массивов предлагает немного лучшее решение:
Это значительно сокращает количество объявляемых переменных, но totalScore по-прежнему требует, чтобы каждый элемент массива был указан отдельно. Как и выше, изменение количества студентов означает, что формулу totalScore необходимо изменить вручную.
Если бы только был способ перебрать наш массив и напрямую вычислить totalScore .
Циклы и массивы
В предыдущем уроке вы узнали, что индекс массива не обязательно должен быть постоянным значением – он может быть переменной. Это означает, что в качестве индекса массива мы можем использовать переменную цикла для перебора всех элементов нашего массива и выполнения над ними каких-либо вычислений. Это настолько обычное дело, что везде, где вы найдете массивы, вы почти наверняка найдете и циклы! Когда цикл используется для доступа к каждому элементу массива по очереди, это часто называется итерацией по массиву.
Вот наш пример выше, модифицированный для использования цикла for :
Это решение идеально как с точки зрения читабельности, так и с точки зрения поддержки. Поскольку все обращения к нашим элементам массива выполняет цикл, формулы автоматически корректируются с учетом количества элементов в массиве. Это означает, что для учета новых студентов вычисления не нужно изменять вручную, и нам не нужно вручную добавлять имена новых элементов массива!
Вот пример использования цикла для поиска в массиве, чтобы определить лучший результат в классе:
В этом примере мы используем переменную maxScore , не являющуюся переменной цикла, для поиска максимального результата. maxScore инициализируется значением 0, чтобы показать, что мы еще не видели никаких оценок. Затем мы перебираем каждый элемент массива и, если находим результат выше, чем тот, который мы видели ранее, мы устанавливаем maxScore в это значение. Таким образом, maxScore всегда представляет собой максимальный результат из всех элементов, среди которых мы искали на данный момент. К тому времени, когда мы достигаем конца массива, maxScore будет равна наивысшему баллу во всем массиве.
Смешивание циклов и массивов
Циклы обычно используются с массивами для выполнения одной из трех задач:
- расчет значения (например, среднее значение, общее значение);
- поиск значения (например, наибольшее значение, наименьшее значение);
- реорганизация массива (например, по возрастанию, по убыванию)
При вычислении значения для хранения промежуточного результата обычно используется переменная, которая используется для вычисления окончательного значения. В приведенном выше примере, где мы вычисляем средний балл, totalScore содержит сумму баллов для всех просмотренных элементов.
При поиске значения переменная обычно используется для хранения значения лучшего кандидата, просмотренного на данный момент (или индекса лучшего кандидата в массиве). В приведенном выше примере, где мы используем цикл для поиска лучшего результата, maxScore используется для хранения максимального результата, обнаруженного на данный момент.
Сортировка массива немного сложнее, поскольку обычно включает вложенные циклы. Сортировку массива мы рассмотрим в следующем уроке.
Массивы и ошибки на единицу
Один из самых сложных моментов в использовании циклов с массивами – убедиться, что цикл повторяется нужное количество раз. Легко допустить ошибку на единицу, и попытка получить доступ к элементу, который больше, чем длина массива, может иметь ужасные последствия. Рассмотрим следующую программу:
Проблема с этой программой в том, что условие в цикле for неверно! Объявленный массив имеет 5 элементов, пронумерованных от 0 до 4. Однако этот массив перебирается в цикле от 0 до 5. Следовательно, на последней итерации массив выполнит следующее:
Но элемент scores[5] не определен! Это может вызвать всевозможные проблемы, наиболее вероятно, что scores[5] приведет к мусорному значению. В этом случае вероятный результат – maxScore окажется неверным.
Однако представьте, что произойдет, если мы случайно присвоим значение элементу scores[5] ! Мы можем перезаписать другую переменную (или ее часть) или, возможно, что-то повредить – эти типы ошибок очень сложно отследить!
Следовательно, при использовании циклов с массивами всегда дважды проверяйте условия цикла, чтобы убедиться, что вы не допускаете ошибки на единицу.
Небольшой тест
Вопрос 1
С помощью цикла выведите на экран следующий массив:
Подсказка: чтобы определить длину массива, вы можете использовать std::size (начиная с C++17) или трюк с sizeof() (до C++17).
Вопрос 2
Используя массив из вопроса 1.
Попросите пользователя ввести число от 1 до 9. Если пользователь не вводит число от 1 до 9, повторно запрашивайте целочисленное значение, пока он не введет его. После того, как он ввел число от 1 до 9, распечатайте массив. Затем найдите в массиве значение, введенное пользователем, и напечатайте индекс этого элемента.
Проверить std::cin на недопустимый ввод вы можете, используя следующий код:
Вопрос 3
Измените следующую программу так, чтобы вместо того, чтобы maxScore содержала непосредственно наибольший результат, переменная с именем maxIndex содержала индекс элемента с наибольшим результатом.