Файл: Массивы и их роль в написании программного обеспечения..pdf
Добавлен: 01.04.2023
Просмотров: 283
Скачиваний: 2
Введение
Развитие современного общества предполагает широкое использование компьютерных и информационных технологий, на основе которых создаются разнообразные информационные системы. Компьютерные программы получают результаты, обрабатывая данные.
При обработке однотипных данных используются массивы, являющиеся наряду с циклами основополагающим инструментом программирования. Массивы позволяют избегать нарастания кода и разрабатывать компактные, понятные и красивые программы, сточки зрения синтаксиса программы.
Актуальность данной темы заключается в том, что не одна разработка программного обеспечения не обходится без применения данного типа данных.
Предметом работы являются массивы данных в языках программирования и их использование при разработке программного обеспечения.
Целью данной работы является изучение массивов и их роль в написании программного обеспечения.
По ходу работы буду решаться следующие задачи:
- Изучение теоретических основ массивов и их видов.
- Увидеть особенности реализации массивов в разных языках программирования.
- Найти решения по применению массивов в разработке программ.
В данной работе использованы учебники, учебные пособия, книги по программированию ведущих авторов и университетов.
1. Массив как один из видов типов данных
1.1 Определение массива
«Массив представляет собой набор однотипных данных, объединенных общим именем. Доступ к элементу массива выполняется через имя массива и индекс или индексы, идентифицирующие место, или «позицию», элемента в массиве. Существует такое понятие, как размерность массива, - это количество индексов, необходимых для однозначной идентификации элемента массива. Теоретически массив может быть практически любой размерности. Но на практике массивы размерности большей, чем два, используется редко.»[9,189]
Поддержка индексных массивов (свой синтаксис объявления, функции для работы с элементами и т. д.) есть в большинстве высокоуровневых языков программирования. Максимально допустимая размерность массива, типы и диапазоны значений индексов, ограничения на типы элементов определяются языком программирования или конкретным транслятором.
«Без использования массивов не обойтись в таких областях программирования как работа с базами данных, компьютерная графика, визуализация результатов научных экспериментов, статистический анализ. Например, можно описать массив, состоящий из тысячи элементов численного типа, и затем обратиться к десятому или сотому элементу по его номеру. Массивы являются входными и выходными параметрами процедур сортировки.»[1,527]
«При описании массива обычно указывается его размер (число элементов) или верхняя и нижняя границы — диапазон, в рамках которого можно обращаться к элементам массива.»[4,57]
« Массивы, границы которых явно заданы в команде описания, называются статическими. Их размер известен заранее и не меняется на всем протяжении работы программы. В последних версиях компилируемых языков программирования реализуются так называемые динамические массивы, размер которых может меняться во время выполнения программы. В ряде случаев это весьма удобно, так как позволяет экономно расходовать память, захватывая ее по мере необходимости. Недостаток динамических массивов в том, что организовать эффективную работу с ними, используя компиляторы, сложно. Приходится выполнять множество проверок, связанных с расходованием памяти компьютера, что понижает общую эффективность приложения.»[8,110]
« Все элементы массива индексируются последовательно, начиная с нуля. Размещение элементов массива в памяти выполняется последовательно. Все элементы массива имеют один и тот же тип. Элементы массива обычно нумеруются индексами от 0 до n-1, где n - число элементов массива. В некоторых языках можно задавать границы изменения индексов, в других нижняя граница значения индекса равна единице, а не нулю.»[10,87]
« При обращении к массиву желательно проверять значение текущего индекса. Значение должно находиться в пределах допустимого диапазона. Такая проверка способствует повышению надежности вычислений. Однако реализована она только в языках Pascal, Ada, Java и C#. В других языках (например, в С и С++) проверка отсутствует в силу специфики организации массивов.»[3,578]
Так же массивы делятся на одномерные (линейные), двумерные (матричные), трехмерные и тд. Но чаще всего используются одномерные и двумерные массивы. В одномерном массиве используется один индекс, в двумерном два.
1.2 Разновидности массивов
Связывание типа индекса массива с переменного массива обычно выполняется статически, но по диапазону индексов связывание происходит иногда динамически.
«В некоторых языках нижняя граница диапазона значений индексов задается по умолчанию. Например, в С-подобных языках нижняя граница всех диапазонов индексов равна нулю. В языке Fortran 95 (и выше) она зафиксирована как единица, но может принимать любое целое значение. В большинстве других языков диапазоны индексов полностью определяются программистом. Классифицируем массивы по трем признакам: связывание по диапазонам индексов, связывание с памятью, категория памяти для размещения.»[2,345]
Всего возможны пять разновидностей массивов. В первых четырех разновидностях связывание по диапазону индексов и размещению в памяти сохраняется в течение всего времени жизни переменной. Имеется в виду, что при фиксации диапазонов индексов массив уже не может изменить размер.
«Статическим называют массив со статическим связыванием по диапазонам индексов и таким размещением в памяти, которое происходит до начала работы программы. Статические массивы достаточно эффективны, поскольку отсутствуют затраты времени как на динамическое размещение в памяти, так и на удаление из нее. Недостатком является то, что память ими занимается на все время выполнения программы.»[10,87]
«Явным стековым называется массив со статическим связыванием по диапазонам индексов и таким размещением в памяти, которое происходит по итогам обработки объявления в ходе выполнения программы.»[7,65]
Массив удаляется из стековой памяти по завершению работы программы (подпрограммы). В сравнении со статическими явные стековые массивы повышают эффективность использования памяти: крупный массив одной подпрограммы может занимать ту же область памяти, что и большой массив другой подпрограммы, причем так может продолжаться до тех пор, пока обе подпрограммы не окажутся активными одновременно.
К недостатку следует отнести дополнительные затраты времени на размещение и удаление массива из памяти.
«Cтековым называется массив с динамическим связыванием по диапазонам индексов и динамическим размещением в памяти, которое происходит в ходе обработки объявления. Связанность диапазонов индексов и размещение массива в памяти сохраняются в течение всей жизни переменной. Главным преимуществом этой разновидности массивов по сравнению с двумя предыдущими считается гибкость — не нужно заранее знать (до момента использования) размер массива.»[3,580]
«Явный динамический массив подобен явному стековому массиву в том, что связывание и по диапазонам индексов, и по памяти происходит после размещения в памяти. Связывание по индексам и памяти производится по запросу программы и в течение ее выполнения, но память выделяется в куче, а не в стеке. Преимуществом этой разновидности массивов является гибкость: изменение размера массива всегда остается проблемой. Недостаток — на размещение в куче тратится времени больше, чем на размещение в стеке.»[8,112]
«Динамическим называется массив с таким динамическим связыванием по диапазонам индексов и размещению в памяти, которое повторяется многократно в течение всего жизненного цикла массива. Преимущество: максимальная гибкость. Массив по мере необходимости может расти или сжиматься прямо в ходе выполнения программы. Недостаток — на многократное размещение (удаление) в куче тратится много времени (и все оно приходится на период вычислений).»[2,378]
«Прямоугольный массив — это многомерный массив, в котором все строки и столбцы имеют одинаковое количество элементов. Прямоугольные массивы точно моделируют прямоугольные таблицы.»[7,71]
Возможны два варианта размещения двухмерного массива в памяти: по строкам и по столбцам.
«Массив массивов — это многомерный массив, в котором не требуется, чтобы длины у строк были одинаковыми. Массивы массивов иногда называют не выровненными массивами.»[5,285]
Например, не выровненная матрица может состоять из трех строк, одна из которых содержит пять элементов, другая — семь элементов, а третья — двенадцать элементов. Все эти соображения применимы и к массивам более высоких размерностей.
«Так, для трехмерного массива в третьем измерении (измерении уровней) каждый уровень может иметь различное количество элементов. Не выровненные массивы становятся возможны, когда многомерные массивы, по сути, являются массивами, состоящими из массивов. Например, матрица строится как массив из одномерных массивов.»[3,285]
Иногда на предварительное упорядочение элементов данных в массиве просто нет времени, или же накладные расходы на поддержание порядка очень велики.
В таких ситуациях желателен альтернативный подход к хранению и извлечению данных из массива. Такой подход реализуют ассоциативные массивы.
«Ассоциативный массив — это неупорядоченное множество элементов данных, индексированных таким же количеством величин, которые называются ключами.»[6,77]
В обычных массивах индексы никогда не надо запоминать. В ассоциативном массиве ключи определяются конкретным пользователем и должны содержаться в самой структуре массива. Каждый элемент ассоциативного массива несет в себе ключ и значение. Ключ является единственным средством доступа к значению.
«Ассоциативные массивы широко используются в таких языках, как Perl, Python, Ruby и Lua. Кроме того, они обеспечиваются стандартными библиотеками классов в языках Java, C++, C# и F#.»[10,83]
Как мы видим массивы представлены во всех языках программирования, из этого следует что данный вид структуры данных имеет важную роль в разработке программ.
Существуют разные виды массивов, как по устройству данных в них, так и по способу их обработки. Массивы позволяют хранить большое количество данных в одной переменной, не перегружая код программы. Что хорошо сказывается на читабельности и понятности кода, для того, кто его изучает.
Так же использование массивов делает работу программы быстрее, что хорошо складывается на работе кода в общем, так как в высокоуровневых языках программирования скорость программы занижена по сравнению с языками низкого уровня.
2. Особенности и примеры использования массивов
2.1 Особенности использования массивов в разных языках программирования
«В языке Паскаль могут использоваться объекты, содержащие множество однотипных элементов. Упорядоченность данных в массиве позволяет обращаться к любому элементу массива по его порядковому номеру (индексу). Элементы массива расположены последовательно в непрерывной области памяти. Нужно четко понимать, что индекс ячейки массива не является ее содержимым. Содержимым являются хранимые в ячейках данные, а индексы только указывают на них. Индексы элементов массива обычно целые числа, однако могут быть и символами, а также описываться другими порядковыми типами. Зачастую для задания количества элементов массива используется тип-диапазон. Тип-диапазон задается левой и правой границами изменения индекса массива.»[1,525] Описание массива перед использованием массив, как и любая переменная, должна быть объявлена (описана). Описание типа массива задается следующим образом:
type имя типа = array[ список индексов ] of тип;
Здесь имя типа – правильный идентификатор;
список индексов – список одного или нескольких индексных типов, разделенных запятыми;
тип – любой тип данных.
Пример. const n = 5;
type mas = array[1..n] of integer;{Объявлен тип mas, являющийся массивом (array) целых чисел (integer), границы изменения индекса массива – 1… n} var a: mas;
Определить переменную как массив можно и непосредственно при ее описании в разделе var, без предварительного описания типа массива, например:
var a,b,c: array[1..10] of integer;{Объявлены три массива a, b, c, состоящие из десяти целых элементов} Обращение к определенному элементу массива осуществляется путем указания имени переменной массива и в квадратных скобках индекса элемента, например a[3] – обращение к третьему элементу массива a, a[i] – обращение к i-му элементу массива a.