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


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

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



 

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

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

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

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

[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 (дескрипторФайла) - возвращает размер текстового файла в символах.

 

Пользовательский тип данных

 

Файлы произвольного доступа хранят структурированные данные и состоят из записей.

Запись – это некоторая порция данных, которая имеет строго определенный размер и свой номер в файле.

Доступ к данным произвольного доступа осуществляется по номеру записи. Чтение данных или запись данных в файл произвольного доступа также выполняется записями. Запись файла должна иметь определенную структуру.

Для определения переменных, которые могли бы хранить структуру в VISUAL BASIC, нет встроенных типов таких как, например Integer, String и т.д. Однако VISUAL BASIC позволяет создавать на основе встроенных типов так называемые пользовательские типы. К пользовательским типам относиться тип запись. Запись позволяет хранить совокупность данных разного типа и представляет собой структуру, компоненты которой являются полями записи.

Все пользовательские типы необходимо объявлять. Это делается следующим образом:

{ Private| Public} Type ИмяТипаДанных

Элемент1 As ТипЭлемента1

...

ЭлементN As ТипЭлементаN

End Type

Где: ИмяТипаДанных - это имя, которое присваивается определяемому типу данных;

Элемент1- ЭлементN – имена полей записи;

ТипЭлемента – любой встоенный или объявленный ранее пользовательский тип.

Примечание: все данные String должны иметь фиксированную длину.

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

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

‘(General)(Declarations)

Public Type ДанныеСтудент

Фамилия As String*15

Имя As String*10

Группа As String*4

ОцМатем As Integer

ОцИнфор As Integer

ОцФилос As Integer

End Type

После определения пользовательского типа данных необходимо объявить переменные, которые будут иметь этот тип.

Объявим переменную Студент, имеющую пользовательский тип ДанныеСтудент и найдем длину записи, которой будет являться любое значение этой переменной:

Dim Студент As ДанныеСтудент, x AsInteger

x= Len (Студент)

Переменные пользовательского типа могут быть локальными, глобальными и переменными контейнера

 



Поделиться:


Последнее изменение этой страницы: 2017-02-08; просмотров: 802; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.19.31.73 (0.035 с.)