Visual Basic - уроки, Масиви, записи та перерахування
На попередньому уроці ми розглянули з вами таку важливу річ як змінні. А змінні - це ж шматочки пам'яті, де зберігаються дані. Значить, якщо ефективно використовувати змінні – ми ефективно використовуємо пам'ять. А якщо ми ефективно використовуємо пам'ять - то пам'яті для програми потрібно менше і програма працює швидше. Так ось для того, щоб ці дані використовувати з максимальною ефективністю, і в той же час з легкістю, були придумані масиви (Arrays), записи (Types) і перерахування (Enums).
Їх ще називають списками. Отже, що ж таке масиви? Масив (вектор) - це набір однотипних змінних, об'єднаних одним ім'ям і доступних через це ім'я та порядковий номер змінної набору. Кількість елементів масиву теоретично може бути нескінченною, обмеження накладаються конкретними мовою програмування та операційною системою. Елементи масиву мають безперервну нумерацію певного діапазону.
У програмуванні масиви використовуються досить часто. Наприклад, вам потрібно завантажити в програму вміст файлу. Якщо цей рядковий файл, то можна використовувати рядок і обійтися без масиву. А от якщо файл бінарний (двійковий), то тут без масиву просто не обійтися!
У Visual Basic масиви визначаються так:
Dim myArray (10) As Long
Як ви могли помітити, визначення масиву відрізняється від визначення звичайної змінної лише індексом, вказаним у дужках. Цей індекс вказує розмірність масиву. У даному випадку масив myArray міститиме 11 елементів. Чому 11? Тому що нижня межа масиву починається з нуля. [0,1,2. 9,10]. Щоб задати певну розмірність, можна використовувати зарезервоване слово To:
Dim myArray (5 To 10) As Long
Тут визначається масив, розмірність якого 6 елементів (5,6,7,8,9,10).
Загальний синтаксис визначення масиву наступний:
Dim Ім'яМассива То НомПосл2, . ) [ As [ New ] Ім'яТипу]
Масиви можна робити багатовимірними. Наприклад, оголосимо масив - таблицю поля шахівниці:
Dim chessTable (1 To 8, 1 To 8) As String
Цей масив є таблицею з восьми осередками по вертикалі і горизонталі.
Отже, масив визначено. Тепер необхідно дізнатися - як можна дістатися елементів цього масиву. Дуже просто! До елементів масиву слід звертатися за індексом, наприклад, щоб змінити нульовий елемент масиву myArray потрібно написати:
chessTable (2,3) = "Пішак"
Массиви змінної розмірності (динамічні)
Динамічні масиви - це масиви, розмірність яких може змінюватися під час роботи програми. Мабуть, динамічні масиви використовуються навіть частіше статичних. Розглянемо характерний приклад використання такого масиву. Нехай ми маємо процедуру, яка завантажує вміст двійкового файлу в масив. Масив ми можемо визначити так:
Dim fileContent (119) As Byte
Але це якщо файл має довжину 120 байт. А що робити, якщо ми не знаємо довжину файлу, що завантажується? Визначати дуже великий масив, щоб напевно туди міг поміститися великий файл? Ні. Так робити не можна. Ось тут і потрібно використовувати динамічний масив.
Visual Basic надає досить потужні засоби роботи з такими масивами. Виділяється такий масив наступним чином:
Dim myArray () As Byte
ReDim myArray (4)
Тепер масив myArray має одну розмірність з індексами від 0 до 4 (тобто всього 5 елементів). Тепер до такого масивуможна звертатися так само, як і до статичного. Якщо надалі виникне потреба знову змінити розмір масиву, можна знову використовувати ReDim.
Але! Тут є підводний камінь! Давайте розглянемо маленький приклад:
Dim myLong As Long Dim myArray() As Long 'оголошуємо масив
ReDim myArray (2) 'одна розмірність [0,1,2] myArray (1) = 234 ' привласнюємо другому елементу чило 234 myLong = myArray (1) ' зберігаємо його в змінній myLong
ReDim myArray (3) ' знову змінюємо розмірність-тепер [0,1,2,3] myLong = myArray (1) ' знову намагаємося зберегти другий елемент
На останньому рядку змінної myLong присвоиться 0 замість 234! Це відбувається тому, що оператор ReDim заново ініціалізує (скидає) всі елементи масиву до значення за умовчанням (як пам'ятаєте, для чисел - це 0, для рядків ""). Але як бути, якщо ми хочемо змінити розміри масиву, зберігши всі старі елементи? Для цього потрібно після оператора ReDim встановити слово Preserve. Приблизно так:
ReDim Preserve myArray (3) ' зберігаємо старі елементи myLong = myArray (1) ' все гаразд
Тепер все у порядку.
Корисні поради щодо роботи з масивами в VB
Масиви можуть зберігатися у змінних типу Variant. Іноді це зручно. У деяких випадках без цього просто не обійтись! (Наприклад, коли хочете, щоб ваша функція повертала масив). Щоб зберегти будь-який масив у змінній типу Variant необхідно просто привласнити цій змінній потрібний масив:
Dim myVariantArray ' змінна Variant за замовчуванням myVarianrArray = chessTable
Зверніть увагу, жодних індексів вказувати не потрібно!
Тепер можна використовувати копію як звичайний масив:
myVarianrArray(0) = "Цекопія"
Ті, хто програмував іншими мовами програмування (таких як C і Pascal), напевно стикалися з поняттям структура (C), і записом (Record у паскалі). У Visual Basic аналогом структури є запис. Запис - це новий, випереджуваний програмістом тип даних, що складається з однієї і більше змінних усередині. Давайте розглянемо це з прикладу. Наприклад, необхідно у програмі зберігати масив студентів. Причому кожен студент має свої характеристики: ПІБ, Вік, Ніличність Грамот. Звичайно, для зберігання таких даних можна використовувати, наприклад масив, що має дві розмірності. Але це не найкращий варіант. Найкраще тут підходять Записи! Потім із запису можна буде зробити масив! Щоб визначити запис у програмі, потрібно використовувати зарезервоване слово Type. Закінчується запис словами End Type:
Private Type Student' замість Private могло бути і Public    FIO As String     Age As Byte & As Boolean End Type
Зауважте, що Dim перед ім'ям змінної вказувати не потрібно. Отже, ми визначили запис у програмі. Тепер можна оголошувати змінні, що має тип - Student (тобто наш новий запис). Наприклад:
Dim NewStud As Student
Слово Student синім виділятися нічого очікувати, т.к. синє підсвічування мають лише зарезервовані слова, вбудовані в Visual Basic
Тепер, до полів запису можна звертатися за допомогою точки:
newStud.FIO = "Василь Васильович Пупкін" newStud.Age = 19 newStud.HasGramot = False
Все як у паскалі. (ну, і майже як С).
Visual Basic дозволяє не вказувати щоразу ім'я змінної типу запис, при зверненні до її елементам. Цеособливо корисно, коли запис має багато внутрішніх членів. Для цього є слово With:
With newStud     .FIO = "Бабай Бабаєвич Бабаєв"     .Age = 20    .HasGramot = True End With
Настав час оголосити масив елементів типу запис (точніше типу Student):
Dim myStudArray (20) As Student
Тут ми оголосили масив із 21 студента. Тепер можна звертатися до елементів масиву так само, як ми це робили раніше:
myStudArray(0).FIO = "Білл Гейтс Пупкінович"
Як бачите все геніальне! Особливо у Visual Basic! :)
Перерахування теж досить важлива та потрібна штука. В принципі ви з ними вже зустрічалися. Де? А згадайте, що відбувалося, коли ви навпроти Boolean змінної ставили знак рівності? Правильно, Visual Basic видавав вам список із двох значень на вибір – True та False. Це і є перерахування. Тобто перерахування - це перелік констант. Перед використанням такого списку його потрібно визначити у програмі. Наприклад, розглянемо перерахування оцінок, які отримують студенти:
Enum Ocenka     Neud = 3     Horosho = 4     
Надавати значення константам усередині Enum не обов'язково. Якщо цього зробити, то константи прийматимуть значення 0,1,2. і т.д.
Тепер можна оголосити змінну типу Ocenka:
Dim oc1 As Ocenka
І, якщо ви тепер спробуєте привласнити таку змінну значення - Visual Basic видасть список (Neud, Horosho і Otlichno) з якого ви зможете вибрати потрібне значення. Також ці константи можна використовувати,наприклад, під час перевірки умов, тобто. If oc1 = Horosho Then. Але про умови пізніше.
Щоб закріпити отримані знання, давайте перевизначимо наш запис Student на який:
Private Type Student' замість Private могло бути і Public    FIO As String     Age As Byte & As Boolean      ikzamenFizika As Ocenka      ikzamenMatan As Ocenka End Type
Тепер, щоб присвоїти оцінку 5 за матаналізом студента під номером 3, необхідно написати:
Примітка: Ті, хто програмував на паскалі, пам'ятають про безліч. Так ось, можу їх засмутити, множин у Visual Basic немає. Але в принципі ніхто не заважає вам реалізувати їх самостійно, написавши відповідні функції.
Ну от і все. На цьому закінчимо з масивами, записами та перерахуваннями. Час переходити до більш практичного - виразів!