Массивы

### Определение

**Массив** - непрерывная последовательность фиксированной длины, состоящая из элементов одного типа. Основной особенность массива является то, что можно получать доступ к его элементам по индексу (номеру элемента в массиве) для чтения/изменения его значения.

Массивы используются для хранения однотипной логически связанной информации. Например, если программа представляется тест с вариантами ответов на вопросы, то массив можно использовать для хранения номеров ответов, которые выбрал пользователь. При этом каждый элемент массива будет соответствовать тестовому заданию: первый элемент хранит номер ответа на первый вопрос, второй элемент - на второй вопрос и т.д.

### Создание массива

Массив создает точно так же как и переменная - при помощи ключевого слова **Dim**. Единственное отличие в том, что после имени массива указывается его размер.

```
**Dim** массив**(**размер**)** **As** **Тип**

```

Например, создание массива из 5 элементов типа Integer.

```
**Dim** int_arr(5) **As** **Integer**

```

Такой массив представляет из себя непрерывную последовательность и 5 **Integer**'в в оперативной памяти, и суммарно занимает 20 байт (так как размер одного **Integer** числа - 4 байта).

Если предположить, что в опративной памяти массив располагается по адресу 100220 (то есть с 100220-го байта), то его можно проиллюстрировать так:

```
100220   100224   100228   100232   100236
+--------+--------+--------+--------+--------+
+--------+--------+--------+--------+--------+

```

Первый элемент хранится по адрес 100220, второй по адресу 100224 (адрес первого + 4 байта), третий по ардесу 100224 (адрес первого плюс 2\*4 байта), и т.д.

В некоторых редких случае удобно имет массив, номера элементов которого "сдвинуты". Например, что бы массив из 5 элементов, индексы элементов начинались от 3 и заканчивались 7. В этом случае можно явно указать диапазанон индексов:

```
**Dim** массив**(**нижний_индекс **To** вернхний_индекс**)** **As** **Тип**

```

Например:

```
**Dim** int_arr(2 To 7) **As** **Integer**

```

### Доступ к элементам

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

```
**Dim** arr(5) **As** **Integer**
arr(1) = 99
**Print** arr(1)

```

Следует заметить, что в FreeBasic индексы в массиве (нумерация элементов) начинаются с 1, в то время как во многих языках они начинаются с 0.

### Обход массива циклом

Если надо выполнить какое-то действи со всеми элементами массива, например, увеличить значения всех элементов на 1, или вывести значения всех элементов на консоль, то удобнее всего для этого использовать Цикл FOR. Дл этого счетчик цикла инициализиуется единицей (начальный индекс массива), и увеличивается на 1 пока не достингет значения равного размеру массива.

Пример: создание массива из 7 элементов типа строка, заполнения их названиями дней недели, и вывод всех элементов в цикле.

```
 **Dim** arr(7) **As** **String**
arr(1) = "Sunday"
arr(2) = "Monday"
arr(3) = "Tuesday"
arr(4) = "Wednesday"
arr(5) = "Thursday"
arr(6) = "Friday"
arr(7) = "Saturday"

**Print** "Days of week:"

**Dim** i **As** **Integer**
**For** i = 1 **To** 7
    **Print** arr(i)
**Next** i

```

Что бы не указывать числом верхнюю границу массива в заголовке цикла FOR, можно воспользоваться функцией **Ubound** (upper bound - верняя граница), которая возвращает верхнюю границу переданного массива (по сути размер, если индексы в массиве начинаются с 1).

```
**For** i = 1 **To** **Ubound(**arr**)**

```

Для случаев, если индексы массива начинаются не с 1, надо так же инициализировать счетчик цикла FOR не 1, а вызовом функции **Lbound** (lower bound - нижняя граница)

```
**Dim** arr(3 To 5) **As** **String**

arr(3) = "Three"

arr(4) = "Four"

arr(6) = "Five"

**Dim** i **As** **Integer**

**For** i = **LBound**(arr) **To** **UBount**(arr)

**Print** arr(i)

**Next** i

```