Массивы статические и динамические.
Массив- это набор элементов определенного типа, каждый из которых имеет свой порядковый номер, называемый индексом. Различают массивы статические и динамические.
Границы статического массива устанавливаются на этапе разработки и могут изменяться только в новой версии программы.
Динамические массивы изменяют свои границы в ходе выполнения программы.
Статические массивы нельзя определить локально внутри процедуры, а только глобально или для контейнера.
[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 дескрипторФайла
Где: имяФайла определяет имя открываемого файла; это либo строка символов, заключенная в кавычки, либо выражение, значением которого является строка символов. Она представляет собой путь к открываемому файлу;
режим - это режим доступа, который может иметь значения:
Input (Ввод) - если файл открывается для чтения из него текстовых данных.
Output (Вывод)- если файл открывается для записи в него данных, начиная с первой позиции. Вся имевшаяся в нем старая информация будет стерта.
Append (Дополнение) - если файл открывается для записи в него данных не с первой, а с конечной позиции, так что вся имевшаяся в нем старая информация будет сохранена.
дескрипторФайла - целое число, по которому идентифицируется открываемый файл. Файловые номера используются при выполнении файловых операций в программе.
Все открытые файлы закрываются оператором:
Close [списокДескрипторов]
списокДескрипторов - это записанные через запятую дескрипторы файлов, которые должны быть закрыты. При отсутствии этого параметра будут закрыты все открытые файлы.
Для записи в файл используются операторы:
Print # ДескрипторФайла, [СписокЗначений]
Write # ДескрипторФайла, [СписокЗначений]
Где: СписокЗначений - это записанные через разделитель значения (или выражения).
Оба оператора записывают данные в файл текстовыми строками. Текстовая строка - это последовательность символов, которая заканчивается символом перехода на новую текстовую строку или символом возврата каретки (коды 13 и 10). Текстовый файл представляет собой последовательность текстовых строк.
Логика работы операторов Write и Print различна.
Оператор Write
Разделителем в списке значений является запятая. Список значений просматривается последовательно, и элементы этого списка записываются в одну текстовую строку файла через запятую. Элементы типа String заключаются в кавычки. После записи последнего элемента записывается символ перехода на новую строку.
Например, напишем программу записи в текстовый файл следующих строк:
"Иванов", 1982
"Петров", 1984
"Сидорова", 1983
"Крылов", 1980
В каждой строке - фамилия и год рождения.
Оператор Print
Элементы списка значений в этом операторе должны быть разделены либо точкой с запятой, либо запятой. От этого зависит, как они будут записаны в текстовую строку файла:
· если (;) - значения будут записываться подряд, без промежутков между ними;
· если (,) - значения будут записываться в 14-символьные зоны вывода.
Кроме того, в списке значений оператора могут присутствовать функции:
· Spc(n) - для вставки n пробелов между значениями в текстовой строке;
· Tab(n) - для указания номера n позиции для записи следующего значения.
На рис. 69 в окне редактора кодов приведен текст процедуры создания текстового файла с использованием оператора Print.
Для чтения из файла используются:
- оператор Input# ДескрипторФайла СписокПеременных
-оператор Line Input # ДескрипторФайла Переменная
- функция Input (ЧислоСимволов, дескрипторФайла)
Оператор Input
Список переменных - это записанные через запятую переменные любого типа. В каждой текстовой строке файла количество и тип значений должны совпадать с количеством и типом переменных в списке переменных.
Оператор Line Input
Переменная - это переменная типа String или Variant. Результатом работы этого оператора является присвоение Переменной значения - всей очередной текстовой строки файла.
Функция Input
ЧислоСимволов - это количество символов, которое надо прочесть из входного файла. Функция возвращает текст в виде символьной строки. Чаще всего эту функцию используют для одновременного чтения всего текстового файла и размещения его в текстовом поле экранной формы.
Рассмотрим примеры чтения созданного в предыдущем примере файла ГодР1.txt:
Аналогичный результат дает работа программы, использующей оператор 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
Пример использования функции 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
При обработке файлов также используются функции:EOF(дескрипторФайла) - возвращает значение True, если обнаружен конец файла и False - в противном случае.
LOF(дескрипторФайла) - возвращает размер текстового файла в символах.
Дата добавления: 2015-08-08; просмотров: 643;