Программирование. Одномерные массивы Pascal-Паскаль. Что такое массив. Объявление одномерного массива Массивы кратко
При решении задач с большим количеством данных одинакового типа использование переменных с различными именами, не упорядоченных по адресам памяти, затрудняет программирование. В подобных случаях в языке Си используют объекты, называемые массивами.
— это непрерывный участок памяти, содержащий последовательность объектов одинакового типа, обозначаемый одним именем.
Массив характеризуется следующими основными понятиями:
Элемент массива (значение элемента массива)
– значение, хранящееся в определенной ячейке памяти, расположенной в пределах массива, а также адрес этой ячейки памяти.
Каждый элемент массива характеризуется тремя величинами:
- адресом элемента — адресом начальной ячейки памяти, в которой расположен этот элемент;
- индексом элемента (порядковым номером элемента в массиве);
- значением элемента.
Адрес массива – адрес начального элемента массива.
Имя массива – идентификатор, используемый для обращения к элементам массива.
Размер массива – количество элементов массива
Размер элемента – количество байт, занимаемых одним элементом массива.
Графически расположение массива в памяти компьютера можно представить в виде непрерывной ленты адресов.
Представленный на рисунке массив содержит q элементов с индексами от 0 до q-1 . Каждый элемент занимает в памяти компьютера k байт, причем расположение элементов в памяти последовательное.
Адреса i -го элемента массива имеет значение
Адрес массива представляет собой адрес начального (нулевого) элемента массива. Для обращения к элементам массива используется порядковый номер (индекс) элемента, начальное значение которого равно 0 . Так, если массив содержит q элементов, то индексы элементов массива меняются в пределах от 0 до q-1 .
Длина массива – количество байт, отводимое в памяти для хранения всех элементов массива.
ДлинаМассива = РазмерЭлемента * КоличествоЭлементов
Для определения размера элемента массива может использоваться функция
int
sizeof
(тип);
Например,
sizeof
(char
) = 1;
sizeof
(int
) = 4;
sizeof
(float
) = 4;
sizeof
(double
) = 8;
Объявление и инициализация массивов
Для объявления массива в языке Си используется следующий синтаксис:
тип имя[размерность]={инициализация};
Инициализация
представляет собой набор начальных значений элементов массива, указанных в фигурных скобках, и разделенных запятыми.
int
a = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; // массив a из 10 целых чисел
Если количество инициализирующих значений, указанных в фигурных скобках, меньше, чем количество элементов массива, указанное в квадратных скобках, то все оставшиеся элементы в массиве (для которых не хватило инициализирующих значений) будут равны нулю. Это свойство удобно использовать для задания нулевых значений всем элементам массива.
int
b = {0}; // массив b из 10 элементов, инициализированных 0
Если массив проинициализирован при объявлении, то константные начальные значения его элементов указываются через запятую в фигурных скобках. В этом случае количество элементов в квадратных скобках может быть опущено.
int
a = {1, 2, 3, 4, 5, 6, 7, 8, 9};
При обращении к элементам массива индекс требуемого элемента указывается в квадратных скобках .
Пример на Си
1
2
3
4
5
6
7
8
#include
int
main()
{
int
a = { 5, 4, 3, 2, 1 }; // массив a содержит 5 элементов
printf("%d %d %d %d %d\n"
, a, a, a, a, a);
getchar();
return
0;
}
Результат выполнения программы:
Однако часто требуется задавать значения элементов массива в процессе выполнения программы. При этом используется объявление массива без инициализации. В таком случае указание количества элементов в квадратных скобках обязательно.
int
a;
Для задания начальных значений элементов массива очень часто используется параметрический цикл:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include
int
main()
{
int
a;
int
i;
// Ввод элементов массива
for
(i = 0; i<5; i++)
{
printf("a[%d] = "
, i);
scanf("%d"
, &a[i]);
}
// Вывод элементов массива
for
(i = 0; i<5; i++)
printf("%d "
, a[i]); // пробел в формате печати обязателен
getchar(); getchar();
return
0;
}
Результат выполнения программы
Многомерные массивы
В языке Си могут быть также объявлены многомерные массивы. Отличие многомерного массива от одномерного состоит в том, что в одномерном массиве положение элемента определяется одним индексом, а в многомерном - несколькими. Примером многомерного массива является матрица.
Общая форма объявления многомерного массива
тип имя[размерность1][размерность2]...[размерностьm];
Элементы многомерного массива располагаются в последовательных ячейках оперативной памяти по возрастанию адресов. В памяти компьютера элементы многомерного массива располагаются подряд, например массив, имеющий 2 строки и 3 столбца,
int
a;
будет расположен в памяти следующим образом
Общее количество элементов в приведенном двумерном массиве определится как
КоличествоСтрок * КоличествоСтолбцов = 2 * 3 = 6.
Количество байт памяти, требуемых для размещения массива, определится как
КоличествоЭлементов * РазмерЭлемента = 6 * 4 = 24 байта.
Инициализация многомерных массивов
Значения элементов многомерного массива, как и в одномерном случае, могут быть заданы константными значениями при объявлении, заключенными в фигурные скобки {} . Однако в этом случае указание количества элементов в строках и столбцах должно быть обязательно указано в квадратных скобках .
Пример на Си
1
2
3
4
5
6
7
8
9
#include
int
main()
{
int
a = { 1, 2, 3, 4, 5, 6 };
printf("%d %d %d\n"
, a, a, a);
getchar();
return
0;
}
Однако чаще требуется вводить значения элементов многомерного массива в процессе выполнения программы. С этой целью удобно использовать вложенный параметрический цикл .
Пример на Си
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#define
_CRT_SECURE_NO_WARNINGS
#include
int
main()
{
int
a; // массив из 2 строк и 3 столбцов
int
i, j;
// Ввод элементов массива
for
(i = 0; i<2; i++) // цикл по строкам
{
for
(j = 0; j<3; j++) // цикл по столбцам
{
printf("a[%d][%d] = "
, i, j);
scanf("%d"
, &a[i][j]);
}
}
// Вывод элементов массива
for
(i = 0; i<2; i++) // цикл по строкам
{
for
(j = 0; j<3; j++) // цикл по столбцам
{
printf("%d "
, a[i][j]);
}
printf("\n"
); // перевод на новую строку
}
getchar(); getchar();
return
0;
}
Передача массива в функцию
Обработку массивов удобно организовывать с помощью специальных функций. Для обработки массива в качестве аргументов функции необходимо передать
- адрес массива,
- размер массива.
Исключение составляют функции обработки строк, в которые достаточно передать только адрес.
При передаче переменные в качестве аргументов функции данные передаются как копии. Это означает, что если внутри функции произойдет изменение значения параметра, то это никак не повлияет на его значение внутри вызывающей функции.
Если в функцию передается адрес переменной (или адрес массива), то все операции, выполняемые в функции с данными, находящимися в пределах видимости указанного адреса, производятся над оригиналом данных, поэтому исходный массив (или значение переменной) может быть изменено вызываемой функцией.
Пример на Си
Дан массив из 10 элементов. Поменять местами наибольший и начальный элементы массива. Для операций поиска максимального элемента и обмена использовать функцию.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#define
_CRT_SECURE_NO_WARNINGS
#include
// Функция обмена
void
change(int
*x, int
n)
{
// x - указатель на массив (адрес массива)
// n - размер массива
int
i;
int
max, index;
max = x;
index = 0;
// Поиск максимального элемента
for
(i = 1; i
if
(x[i]>max)
{
max = x[i];
index = i;
}
}
// Обмен
x = x;
x = max;
}
// Главная функция
int
main()
{
int
a;
int
i;
for
(i = 0; i<10; i++)
{
printf("a[%d] = "
, i);
scanf("%d"
, &a[i]);
}
change(a, 10); // вызов функции обмена
// Вывод элементов массива
for
(i = 0; i<10; i++)
printf("%d "
, a[i]);
getchar();
getchar();
return
p = p * x[i];
}
return
p;
}
// Главная функция
int
main()
{
int
a; // объявлен массив a из 5 элементов
int
i;
int
pr;
// Ввод элементов массива
for
(i = 0; i<5; i++)
{
printf("a[%d] = "
, i);
scanf("%d"
, &a[i]); // &a[i] - адрес i-го элемента массива
}
pr = func(a, 5); // вычисление произведения
printf("\n pr = %d"
, pr); // вывод произведения четных элементов
getchar(); getchar();
return
0;
}
Если Вы хотите узнать о массивах деревьев, то эта статья не о том. Но не спешите закрывать статью, она поможет Вам стать еще более эрудированным, ведь помимо древесных массивов, Вы узнаете, что такое массив в программировании. Действительно, у слов, столько значений, что можно запутаться...
Массив в программировании
Чтобы добиться понимания, начнем с самого простого определения массива.
Массив есть скрытый под определенным именем набор значений. То есть можно говорить о множестве переменных, имеющих то или иное значение, а можно сказать о наборе этих переменных (однородных элементов), к каждой переменной можно обратиться по ее индексу, или порядковому номеру (записывается в квадратных скобках).
Для наглядности приведем пример из жизни. Так список студентов в журнале будет представлять собой массив. Порядковый номер каждого студента (обычно они идут по алфавиту, т.е. фамилии на "А" будут первыми) - это его индекс.
Каждое значение массива (студенты в примере) именуется компонентой (или элементом).
Массивы используют для решения различных задач программирования.
Виды массивов
Можно говорить о двух видах массивов:
- одномерные;
- многомерные.
Однако, наиболее часто пользуются одномерными и двумерными массивами в решении задач программирования.
- Чтобы нагляднее представить, что такое одномерный массив, представим тетрадный листок в клетку. Так, любая линия по вертикали или горизонтали (а можно и по диагонали) - вот он, одномерный массив. А количество клеточек будет определять размерность данного одномерного массива. В каждый элемент (клеточку) можно записать значение (например, число), но только одно (!). Найти это значение можно, указав его порядковый номер (в квадратных скобочках).
- Рассмотрим, что такое массив двумерный все на том же примере тетрадного листка в клеточку. Несколько клеток по горизонтали, несколько по вертикали - и у нас образуется некоторая прямоугольная табличка (о квадратной читайте ниже). Она и будет двумерным массивом. Здесь можно говорить о строках матрицы (клетки по вертикали) и столбцах (соответственно, горизонтальные клетки). Как и в массиве одномерном, в каждой клеточке хранится одно значение. Отличие - в поиске нужного значения. Здесь уже нужно указывать номер строчки и номер столбца, пересечение которых даст нужный нам элемент.
Вариантом двумерного массива является квадратная матрица, где количество столбцов и строк одинаково. В этом случае в программировании не надо вводить количество строчек и столбцов, достаточно указать лишь размерность нашей матрицы.
В квадратной матрице есть два вида диагоналей:
- главная - из верхнего левого уголка в нижний правый (т.е. где номер строки и столбца совпадает);
- побочная - идет из верхнего правого уголка в нижний левый.
Для закрепления приведем еще один пример из жизни, иллюстрирующий нам массивы.
Итак, жильцы подъезда, - пусть это будет массив под именем К.
Индекс здесь - номер квартиры. Этот элемент (квартира) представляет собой еще один массив - жильцы квартиры. Например, в 1-ой квартире живер 4 человека, во 2-ой - 3 человека, в 3-ей - 5 человек.
Так, одномерный массив - это перечисление в квадратных скобках (!) количества жильцов: 4, 3, 5.
Двумерный массив (вместо квадр. скобок у нас будет "*"): **1, 1, 1, 1*, *1,1,1*, *1, 1, 1, 1, 1**
Собственно и все. А о том, что такое raid-массив, Вы можете прочитать .
Описание массива позволяет использовать в программе любой из его элементов. Для обозначения элементов массива в Си используются индексированные переменные.
Индексированная переменная (индексное выражение) – обозначение ячейки для хранения элемента массива. Именуется указанием идентификатора массива и индекса (индексов) элемента.
ü Внимание! Особенность обозначения элементов массива в Си - нумерация индексов от 0, а не от 1. Поэтому индексы в Си на единицу меньше заданных математически. Это обстоятельство должно учитываться в программе, особенно при формировании условия повторения (выхода из) цикла.
Схема распределения памяти для хранения одномерного массива такова:
Длина ячейки для хранения каждого элемента определяется типом массива:
· символьный – 1 байт;
· целочисленный – 2 байта;
· вещественный – 4 байта;
· двойной точности – 8 байт.
Структура обозначения индексированной переменной одномерного массива:
имя[индекс]
Где имя – идентификатор массива;
индекс – операнд целого типа, определяющий номер элемента в ряду других, составляющих массив;
– ограничители индекса.
Например, в описанном ранее массиве D(16) первый элемент обозначается индексным выражением d, второй – d, текущий – d[i], предпоследний – d и последний – d.
При необходимости индекс может задаваться арифметическим выражением. Например, d или d. В любом случае на момент использования переменной индекс должен быть определен (рассчитан) и полученное значение должно укладываться в заданный описателем диапазон.
Рассмотренный пример идентификации элементов массива D применим к любому из описанных одномерных массивов.
Индексированные переменные позволяют осуществить программную реализацию алгоритмов с использованием элементов массивов. При этом для одномерного массива индексированная переменная позволяет определить конкретный адрес каждого элемента.
Адрес любой переменной определяется операцией & . Следовательно, у элемента d адрес – &d, у d[i] – &d[i], т.е. все элементы массива располагаются в оперативной памяти линейно, начиная с адреса &d.
В языке Си идентификатор одномерного массива однозначно определяет адрес его первого элемента. Например, c º &c, d º &d.
Адрес каждого элемента одномерного массива выражается зависимостью имя+индекс (индекс определяет сдвиг элемента относительно первого на указанное им количество элементов). Например, &c[i] (адрес i-го элемента массива С) вычисляется как c+i.
Таким образом, индексное выражение полностью определяет конкретную ячейку хранения соответствующего элемента.
>> Статьи
Что такое массивы в программировании?
Массив – это переменная, которая является совокупностью компонентов одного типа. Чтобы использовать массивы в программировании, потребуется предварительное описание определенного типа и указание доступа к элементам. Элементы массива в программировании объединены общим именем. Если требуется обратиться к определенному элементу массива, то достаточно указать имя и индекс. В математике есть понятный пример массива – это векторы и последовательности чисел, в которых группа чисел может обозначаться одним именем. Обратившись к конкретному числу, используют разные индексы.Виды массивов: одномерные и двухмерные
Если для обращения к элементам использован единственный порядковый номер , то массив называется одномерный или линейный. Выглядит как таблица с одной строкой. Размерность массива определяется посредством количества индексов элементов.
Когда использовано два индекса, то массив будет двухмерным. Если массив представлен в идее таблицы, то номер строки будет соответствовать первому индексу, а номер столбца или ячейки – второму.
Как заполнить массив?
Одним из способов заполнения массива является оператор присваивания. Когда элементы связаны реккурентно и имеют определенную зависимость, подойдет такой способ заполнения. Также можно заполнить однородный массив однородными элементами или значениями, которые получены посредством датчика случайных чисел..
Какие действия производятся с элементами массива?
Сортировка элементов в определенном порядке – убывание или возрастание
Поиск значений
Подсчет количества элементов в массиве, соответствующих определенному условию
Когда два массива эквивалентны, то возможно присвоение одному массиву имени другого. Все компоненты копируются в тот массив, которому и присваивается значение.
Как объявить массив
Чтобы объявить массив и выделить в памяти ячейку для хранения элементов, следует указать размерность и имя. Ключевое слово – массив. К примеру, А 20 означает, что одномерный массив состоит из двадцати элементов. К 6,5 означает, что это двухмерный массив , который представлен в виде таблицы из шести строк и пяти ячеек. Если говорить об ограничениях одномерного массива в программировании, то оно составляет тысячу элементов. Для двухмерных массивов максимально допустимым значением станет таблица из тысячи строк и тысячи ячеек.
Массивы в программировании: работа с ними
Когда массив объявлен, каждый элемент подлежит обработке с указанием имени и индекса в квадратных скобках. Чтобы отличить одномерный массив от двухмерного, используются два индекса. Элементы массива с присвоением индекса называются индексированными переменными, но могут использоваться и в качестве простых переменных. К примеру, быть аргументом в команде.
Типы имени, элементов, индексов
Как придумать имя массиву? Подойдет произвольный идентификатор. По правилам стиля имя должно начинаться с буквы Т большого шрифта. Таким образом, можно отличить идентификатор от других. Последующую часть имени можно придумать в соответствии с конкретными данными для хранения в массиве. Вторая составляющая имени также должна начинаться с заглавной буквы. T Vector может хранить информацию о координатах абстрактного вектора.
Что касается типа элементов в массиве, то это может быть ранее введенный или стандартный. Для создания индексов используются целые числа, а типом станет диапазон. Допустим, тип 1…20 говорит о том, что массив состоит из двадцати элементов, каждый из которых соответствует целому числу от одного до двадцати.
Кроме файлового типа. Тип компонент называется базовым типом . Каждая компонента может быть явно обозначена с помощью имени переменной-массива, за которым в квадратных скобках следует индекс . Их тип называется типом индекса . Время, требуемое для доступа любой компоненты, не зависит от значения индекса. Поэтому о массивах можно говорить как об объектах, структура которых допускает случайный (или прямой ) доступ .
Объявление переменных массивового типа
Переменная массивового типа описывается в разделе описания переменных в следующей форме:
Var <идентификатор>: array[<тип индекса>] of <тип компонент>
Чаще всего в качестве типа индекса употребляется интервальный тип . Например, одномерный массив среднемесячных температур опишется так:
Var T: array of real;
Описание массива определяет, во-первых, размещение массива в памяти, во-вторых, правила его дальнейшего употребления в программе. Последовательные элементы массива располагаются в последовательных ячейках памяти (T, T и т.д.), причем значения индекса не должны выходить из диапазона 1...12. В качестве индекса может употребляться любое выражение соответствующего типа. Например:
T, T
Тип индекса может быть любым скалярным порядковым типом, кроме integer (в реализации Turbo Pascal). Например, в программе могут присутствовать следующие описания:
Var Cod: array of 1..100; L: array of Char;
В такой программе допустимы следующие обозначения элементов массивов:
Cod["x"]; L; cod; L;
В некоторых случаях бывает удобно в качестве индекса использовать перечисляемый тип . Например, данные о количестве учеников в четырех десятых классах одной школы могут храниться в следующем массиве:
Type Index=(А, В, С, D); Var Class_10: array of byte;
И если, например, элемент Class_10[A] равен 35, то это означает, что в 10 «А» классе 35 человек. Такое индексирование улучшает наглядность программы.
Часто структурированному типу присваивается имя в разделе типов, которое затем используется в разделе описания переменных.
Type Mas1 = array of integer; Mas2 = array[-10..10] of char; var Num: Mas1; Sim: Mas2;
Многомерные массивы
Многомерный массив в Паскале трактуется как одномерный массив, тип элементов которого также является массивом (массив массивов). Например, среднемесячную температуру за 10 лет можно можно хранить в массиве, описанном следующим образом:
Var H: array of array of real;
Вот примеры обозначения некоторых элементов этого массива:
Н; Н; Н;
Однако чаще употребляется другая, эквивалентная форма обозначения элементов двумерного массива:
Н; Н; Н;
Переменная Н обозначает всю первую строку таблицы, т.е. весь массив температур за 1981 г. Другим вариантом, эквивалентным приведенному выше описанию, является следующий:
Type Month = array of real; Year = array of Month; var H: Year;
Наиболее краткий вариант описания данного массива такой:
Var H: array of real;
Трехмерный массив можно определить как одномерный массив, у которого элементами являются двумерные массивы. Вот пример описания трехмерного массива:
Var A: array of integer;
Это массив, состоящий из 10x20x30 = 6000 целых чисел и занимающий в памяти 6000x2 = 12000 байт. В Паскале нет ограничения сверху на размерность массива. Однако в каждой конкретной реализации Паскаля ограничивается объем памяти, выделяемый под массивы.
По аналогии с математикой одномерные числовые массивы часто называют векторами, а двумерные - матрицами. Размер массивов не может быть изменен в процессе выполнения. Изменение размеров массива происходит через изменение в тексте программы и повторную компиляцию. Для упрощения таких изменений удобно определять индексные параметры в разделе констант:
Сonst Imax=10; Jmax=20; var Mas: array of integer;
Теперь для изменения размеров массива Mas и всех операторов программы, связанных с этими размерами, достаточно отредактировать только одну строку в программе - раздел констант.
Операции над массивами
Действия над массивом как единым целым. Такие действия допустимы лишь в двух случаях:
- присваивание значений одного массива другому;
- операции отношения «равно», «не равно».
В обоих случаях массивы должны иметь одинаковые типы (тип индексов и тип элементов). Пример:
Var P, Q: Array Of Real;
При выполнении операции присваивания P:= Q все элементы массива P станут равны соответствующим элементам массива Q.
В многомерных массивах переменная с индексом может обозначать целый массив. Например, если в таблице H требуется, чтобы данные за 1989 г. были такими же, как за 1981 г. (девятой строке присвоить значение первой строки), то это можно делать так:
Н := Н;
А если нужно поменять местами значения этих строк, то это делается через третью переменную того же типа:
Р:= Н; Н := Н; Н := Р;
где P описана так:
Var P: Array Of Real;
Обработка массивов
Обработка массивов в программах производится покомпонентно. Вот примеры ввода значений в массивы:
For I:= 1 to 12 do readln(T[I]); for I:= 1 to IMax do for J:= 1 to JMax do readln(Mas);
Здесь каждое следующее значение будет вводиться с новой строки. Для построчного ввода используется оператор read . Аналогично в цикле по индексной переменной организуется вывод значений массива. Например:
For I:= 1 tо 12 do write(T[I]:8:4);
Следующий фрагмент программы организует построчный вывод матрицы на экран:
For I:= 1 to IMax do begin for J:= l to JMax do write(Mas:6); writeln; end;
После печати очередной строки матрицы оператор writeln без параметров переведет курсор в начало новой строки. Следует заметить, что в последнем примере матрица на экране будет получена в естественной форме прямоугольной таблицы, если JMax не превышает 12.
Динамические массивы
Во FreePascal, Delphi добавлена интересная возможность описания массивов без указания размерностей и, соответственно, пределов изменения индексов:
Var IntArray: array of integer;
Такие массивы являются динамическими и изначально имеют нулевую длину. Установка размера массива и определение его во время выполнения программы производится так же как и для строк, с помощью функций SetLength и Length , соответственно. Элементы в данном случае нумеруются от нуля.
Program UsingDynamicArrays1; var А, В: Array of Integer; {Описание двух переменных - динамических массивов целочисленных элементов} begin SetLength(A, 5); {Установка размера массива А (5 элементов) } А := 1; {Присвоение значения 1 элементу массива А с номером 0 } end.
Переменные-динамические массивы являются указателями и операции с ними производятся как с указателями. Например, при присвоении одного массива другому элементы одного массива не копируются во второй, а копируется адрес массива. Соответственно, сравнение двух массивов в логических выражениях типа «равно - не равно» производится сравнением адресов. Пример присвоения одного массива другому:
Program UsingDynamicArrays2; var А, В: array of integer; {Описание двух переменных - динамических массивов целочисленных элементов} begin SetLength(A, 5); { Установка размера массива А (5 элементов) } А := 14; {Присвоение значения 14 нулевому элементу массива А} В:= А; {Присвоение массива А массиву В, теперь переменные А и В указывают на один и тот же массив} В := 2; {Присвоение нулевому элементу массива В значения 2, теперь нулевой элемент массива А также имеет значение 2} end.
Отметим существенное отличие в работе со строками и динамическими массивами, имеющими одинаковое внутреннее представление на основе указателей, но разные методы работы. Две разные строки, состоящие из одинакового набора символов, считаются равными, а два разных массива, содержащие одинаковые элементы, не равны.