Массивы

В языке FreeBasic для хранения данных существуют массивы, структуры и собственные типы данных(среди них связанные списки). В этой статье мы рассмотрим массивы.

Массивы - это область памяти с однотипными переменными. Массивы представляют собой как бы ящик из нескольких одинаковых по размеру маленьких ящиков. Но каждый ящик (ячейка) идет под определенным номером(индексом). Самый первый индекс по умолчанию начинается с нуля. Определяется массив как и переменная командой DIM. Правила для имен массива те же, что и у переменных:

Dim As Byte My_array(5)

Здесь мы объявили байтовый массив из 6 ячеек (индекс начинается с нуля!). После объявления мы легко можем заносить  туда значения используя имя массива(My_Array)  и  нужный нам индекс:

My_array(0)=17
My_array(1)=26
My_array(2)=33
My_array(3)=105
My_array(4)=2
My_array(5)=77

Мы занесли значения во все сразу, хотя конечно это не обязательно, можно заносить в те ячейки, в какие требуется. И уж если массив объявлен с типом Byte ,  то в одну из его ячеек число больше 255 не войдет, (вспоминаем переменные). Заносить значения в массив можно прямо при объявлении:

Dim As Byte array(10)={1,4,0,5,8,4,82}
? array(6)
Sleep

Как видите иногда так удобнее. Вы заметили скобочки {....} Они как раз нужны для занесения значений в массив при объявлении. Не пугайтесь если встретите вот такой синтаксис:

Dim As Byte array(10)=>{1,4,0,5,8,4,82}
? array(6)
Sleep

Это тоже самое. Теперь давайте попробуем решить реальную задачу с помощью массивов. К примеру нам нужно в диапазоне значений от 3 до 100 найти все числа делящиеся на 3 без остатка. И так что нам для этого требуется: разделить каждое число от 3 до 100 на цифру 3 , проверить на остаток и если нет остатка, где-то сохранить. Для вычислений и вывода значений будем использовать цикл , а для хранения массив.

Dim As Integer Array(100), counter
For a As Integer=3 To 100
    If a Mod 3 = 0 Then
        Array(counter)=a
        counter+=1
    End If
Next
For a As Integer=0 To counter-1
    Print Array(a)
Next
Print  "Total" , counter
Sleep

В этом примере мы объявили массив из 101 ячейки от 0 до 100 , а так же переменную Counter - это будет счетчик , который не только будет использоваться для внесения значений по порядку в массив, но и покажет нам информацию о том, сколько всего чисел делится на 3 без остатка от 3 до 100. Далее идут два цикла. В одном мы с помощью команды MOD узнаем остаток от деления переменной a  на значение 3. Поскольку а у нас постоянно растет в цикле от 3 до 100 , то  в итоге получается , что мы проверяем каждое число при делении на остаток. Если остаток от деления 0 , то заносим значение в массив. Но обратите внимание как мы это делаем. Вместо числа, в индекс массива мы передаем переменную counter. А она у нас увеличивается на единицу при каждом нахождении числа делящегося без остатка. То есть получается, что в массиве четко и последовательно идут все нужные нам числа. Во втором цикле, мы просто выводим все имеющиеся значения в массиве. Кроме того может стоит сказать о такой записи: counter-1  Если вы заметили в первом цикле мы counter увеличивали на единицу. И в самом последнем проходе увеличение было лишним, поэтому во втором цикле мы просто его на эту единичку уменьшили.  В предпоследней строчке мы вывели общее кол-во чисел делящихся без остатка. 

Мы не совсем экономно расходовали память компьютера выделяя массив так:

Dim As Integer Array(100)

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

Dim As Integer Array(3 To 100)

Вот так мы объявили массив от 3 до 100 . Теперь у нас нижний предел 3 а верхний 100. А чтобы узнавать программно значения верхнего и нижнего пределов, есть две команды:

Ubound (Array)   - узнает верхний предел массива

Lbound (Array)   - узнает нижний предел массива  

В скобках параметром передается имя нашего массива. И конечно пример:

Dim As Integer Array(3 To 100)
? Lbound(Array) 
? Ubound(Array)
Sleep

До этого мы объявляли только одномерные массивы, но в языке FreeBasic можно создать до 8 мерностей (при создании 9 мерности компилятор ругается). На самом деле встретить в исходных текстах массивы с 4 мерностями, как клад найти, хотя трехмерные массивы я встречал не раз. Для того, чтобы объяснить, что из себя представляют многомерные массивы, наверно ничего проще я не придумаю, как приведу пример игры "Морской бой". В ней 100 клеточек и для того, чтобы уничтожить корабль противника, вы выбираете координаты (например В 4).  По своей сути игра представляет собой двумерный массив (10х10) если брать в расчет массив с нижним диапазоном 1 и верхним 10. А теперь пример работы двумерного массива:

Dim As String MyBase(2,2)={{"NAME","SURNAME","PROFESSION"},_
                         {"Richard","Black","Programmer"},_
                         {"David","White","Businessman"}}
For a As Byte=0 To 2
   Print MyBase(a,0),MyBase(a,1),MyBase(a,2)
   Print
Next
Sleep

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

Dim As Integer Array(3 , 4 , 5)
Print Lbound(Array,1),Lbound(Array,2),Lbound(Array,3)
Print Ubound(Array,1),Ubound(Array,2),Ubound(Array,3)
Sleep

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

Redim As Integer Array(3)
Array(1)=15
Redim As Integer Array(12)

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

Redim As Integer Array(3)
Array(1)=15
Redim Preserve As Integer Array(12)
? Array(1)
Sleep

Как вы могли заметить, мы создали динамический массив с 4 индексами, записали в одну из его ячеек значение. Затем пересоздали его с 12 индексами и для наглядности вывели значение в экран консоли.

 И напоследок о массивах: для того чтобы очистить( не удалить ) массив, в FreeBasic есть команда Erase:

Dim As Integer Array(1)={1,2}
Print Array(0) , Array(1)
Erase(Array)
Print Array(0) , Array(1)
Sleep

Удобно и практично, не правда ли? Ну а я заканчиваю статью про массивы. Всего доброго!

содержание | назад | вперед