Массивы статические и динамические

Массив - это набор элементов определенного типа, каждый из которых имеет свой порядковый номер, называемый индексом.

Различают массивы статические и динамические.

Границы статического массива устанавливаются на этапе разработки и могут изменяться только в новой версии программы.

Динамические массивы изменяют свои границы в ходе выполнения программы.

Статические массивы нельзя определить локально внутри процедуры, а только глобально или для контейнера.

[Static| Public| Dim] Имя_массива([Нижн_предел To] Верхн_предел) [As Тип_данных]

Динамический массив создается в два этапа. Сначала массив определяют в секции (General) (Declarations) контейнера (Form, Module) без указания размера. Затем с помощью оператора ReDim устанавливают фактический размер массива:

Синтаксис оператора ReDim:

ReDim [Preserve] Имя_массива(Границы) [As Тип_данных]

В отличие от Dim оператор ReDim используется только в процедурах. При этом тип данных указывать не обязательно, особенно если он уже определен оператором Dim. Использование ключевого слова Preserveпозволяет сохранить содержимое массива при изменении его размерности (однако, для многомерных массивов можно изменять только последнее измерение).

Пример:

'(General) (Declarations)

Dim a() As Variant

Private Sub Command1_Click()

ReDim Preserve a(5,10)

. . . . . . .

End Sub

Область видимости динамических массивов (контейнерных, глобальных) определяется способом их объявления:

Public – глобальный;

Dim - контейнерный.

При необходимости определения фактического размера массива используются встроенные функции:

Lbound(массив, размерность) - нижняя граница.

Ubound(массив, размерность) - верхняя граница.

Пример ввода данных в динамический массив:

Dim ms() As String

Private Sub Command1_Click()

Cls

ReDim ms(0)

s = "Начало работы"

Do Until s = ""

s = InputBox("введите фамилию")

ms(UBound(ms)) = s

ReDim Preserve ms(UBound(ms) + 1)

Loop

ReDim Preserve ms(UBound(ms) - 1)

For i = 0 To UBound(ms)

Print i; " "; ms(i)

Next i

End Sub

VISUAL BASIC позволяет использовать массив в качестве передаваемого в процедуру параметра и в качестве возвращаемого функцией значения.

Пример передачи массива в качестве параметра массива:

Public Sub srt(b() As Integer)

Dim i As Integer, f As Integer, k As Integer

Do

f = 0

For i = LBound(b) To UBound(b) - 1

If b(i) > b(i + 1) Then

k = b(i): b(i) = b(i + 1): b(i + 1) = k: f = 1

End If

Next

Loop While f = 1

End Sub

Private Sub Command1_Click()

Dim a(1 To 5) As Integer

Dim i As Integer

For i = 1 To 5

a(i) = Val(InputBox("Введите число"))

Next

Call srt(a)

Cls

For i = 1 To 5

Print a(i);

Next

End Sub

Пример функции, возвращающей массив:

Public Function VV(ByVal n As Byte) As Byte()

Dim x(1 To n) As Byte, i As Byte

For i = 1 To n

x(i) = Val(InputBox("Введите число"))

Next

VV=x

End Function

Private Sub Commnd1_Click()

Dim b() As Byte, i As Byte

B()=VV(10) ‘вызов функции

For i = 1 To 10

Print b(i)

Next

End Sub

Файлы

Информация хранится на разнообразных носителях в файлах. Процесс работы с файлами состоит из нескольких этапов:

· получение дескриптора файла;

· открытие файла;

· чтение или запись файла;

· закрытие файла.

Дескриптор файла

Для связи системы или приложения с файлом имеется канал ввода/вывода. При открытии файлу ставится в соответствие канал с определенным номером. Допустимо использование номеров 1- 511. Каждый открытый файл имеет собственный канал, с помощью которого записываются или считываются данные. Следовательно, для ввода и вывода данных в файл имеет значение не имя файла, а номер канала. Операционная система должна иметь сведения о наличии свободных каналов, которые можно использовать для открытия файлов.

VISAUL BASIC имеет функцию FreeFile[(дапазонНомеров)], возвращающую номер свободного канала, который можно использовать для работы с файлом. Если свободных каналов нет (открыто максимально допустимое количество каналов), возникает ошибка выполнения. Необязательный параметр дапазонНомеров позволяет определить диапазон значений, из которых выбирается очередной свободный номер канала:

- если 0 (по умолчанию) - возвращается номер канала из диапазона 1-255,

- если 1- то из диапазона 256 - 511.

Типы доступа

В VISAUL BASIC реализованы три типа доступа к файлам:

· последовательный (для обработки текстовых файлов);

· произвольный (для обработки текста или структурированных двоичных файлов с записями фиксированной длины);

· двоичный (для обработки произвольно структурированных файлов).

Последовательный файл состоит из текстовых строк ASCII- формата. Любая информация считывается или сохраняется в текстовом виде построчно. Последовательные файлы могут обрабатываться любым текстовым редактором.

Способ открытия файла с последовательным доступом (для чтения, записи или добавления) задается при вызове оператора открытия файла:

Open имяФайла For режим As дескрипторФайла

где: имяФайла определяет имя открываемого файла; это либо строка символов, заключенная в кавычки, либо выражение, значением которого является строка символов. Она представляет собой путь к открываемому файлу;

режим - это режим доступа, который может иметь значения:

Input (Ввод) - если файл открывается для чтения из него текстовых данных.

Output (Вывод)- если файл открывается для записи в него данных, начиная с первой позиции. Вся имевшаяся в нем старая информация будет стерта.

Append (Дополнение) - если файл открывается для записи в него данных не с первой, а с конечной позиции, так что вся имевшаяся в нем старая информация будет сохранена.

дескрипторФайла - целое число, по которому идентифицируется открываемый файл. Файловые номера используются при выполнении файловых операций в программе.

Все открытые файлы закрываются оператором:

Close [списокДескрипторов]

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

Для записи в файл используются операторы:

Print # ДескрипторФайла, [СписокЗначений]

Write # ДескрипторФайла, [СписокЗначений]

Где: СписокЗначений - это записанные через разделитель значения (или выражения).

Оба оператора записывают данные в файл текстовыми строками. Текстовая строка - это последовательность символов, которая заканчивается символом перехода на новую текстовую строку или символом возврата каретки (коды 13 и 10). Текстовый файл представляет собой последовательность текстовых строк.

Логика работы операторов Write и Print различна.

Оператор Write

Разделителем в списке значений является запятая. Список значений просматривается последовательно, и элементы этого списка записываются в одну текстовую строку файла через запятую. Элементы типа String заключаются в кавычки. После записи последнего элемента записывается символ перехода на новую строку.

Например, напишем программу записи в текстовый файл следующих строк:

"Иванов", 1982

"Петров", 1984

"Сидорова", 1983

"Крылов", 1980

В каждой строке - фамилия и год рождения.

На рис. 7.16 в окне редактора кодов приведен текст процедуры создания текстового файла с использованием оператора Write.

 
  Массивы статические и динамические - student2.ru

Рис. 7.16. Вариант 1. Использование оператора Write.

Оператор Print

Элементы списка значений в этом операторе должны быть разделены либо точкой с запятой, либо запятой. От этого зависит, как они будут записаны в текстовую строку файла:

· если (;) - значения будут записываться подряд, без промежутков между ними;

· если (,) - значения будут записываться в 14-символьные зоны вывода.

Кроме того, в списке значений оператора могут присутствовать функции:

· Spc(n) - для вставки n пробелов между значениями в текстовой строке;

· Tab(n) - для указания номера n позиции для записи следующего значения.

На рис. 7.17 в окне редактора кодов приведен текст процедуры создания текстового файла с использованием оператора Print, а в окне текстового редактора Блокнот – содержимое текстового файла.

 
  Массивы статические и динамические - student2.ru

Рис. 7.17. Вариант 2. Использование оператора Print.

Для чтения из файла используются:

- оператор Input# ДескрипторФайла СписокПеременных

-оператор Line Input # ДескрипторФайла Переменная

- функция Input (ЧислоСимволов, дескрипторФайла)

Оператор Input

Список переменных - это записанные через запятую переменные любого типа. В каждой текстовой строке файла количество и тип значений должны совпадать с количеством и типом переменных в списке переменных.

Оператор Line Input

Переменная - это переменная типа String или Variant. Результатом работы этого оператора является присвоение Переменной значения - всей очередной текстовой строки файла.

Функция Input

ЧислоСимволов - это количество символов, которое надо прочесть из входного файла. Функция возвращает текст в виде символьной строки. Чаще всего эту функцию используют для одновременного чтения всего текстового файла и размещения его в текстовом поле экранной формы.

Массивы статические и динамические - student2.ru
На рис. 7.18 в окне редактора кодов приведен текст процедуры чтения текстового файла ГодР1.txt, созданного в предыдущем примере.

Пример использования функции Input:

Private Sub Command3_Click()

Dim ks As Integer

Open "c:\ГодР1.txt" For Input As #1

ks = LOF(1)

Print Input(ks, #1)

Close #1

End Sub

Аналогичный результат дает работа программы, использующей оператор Line Input:

Пример использования функции Line Input:

Private Sub Command3_Click()

Dim ts As String

Open "c:\ГодР1.txt" For Input As #1

Do Until EOF(1)

Line Input #1, ts

Print ts

Loop

Close #1

End Sub

При обработке файлов также используются функции:EOF(дескрипторФайла) - возвращает значение True, если обнаружен конец файла и False - в противном случае.

LOF(дескрипторФайла) - возвращает размер текстового файла в символах.

Наши рекомендации