Ввод-вывод одномерных массивов. 


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



ЗНАЕТЕ ЛИ ВЫ?

Ввод-вывод одномерных массивов.



 

Массив в программе определяется поэлементно, т. е. каждому элементу массива присваивается определенное значение. Обращение к конкретному эле­менту массива осуществляется по его индексу. Например:

 

Dim B(l To 4) As Single

B(l) = 2

B(2) = 7.5

B(3) = 6

B(4) = 11

 

Этот способ определения можно использовать, если количество элемен­тов массива невелико. Однако часто массив содержит десятки или даже сотни элемен­тов, и такой способ становится неприемлемым из-за большого количества операторов присваивания. Поэтому для ввода больших массивов следует орга­низовать цикл, в котором индекс должен изменяться от нижней до верхней границы.

Для ввода значений элементов массива в диалоговом режиме можно вос­пользоваться функцией InputBox.

Пример. Организовать ввод одномерного массива с помощью функции InputBox и циклической структуры. Ввод массива закончить, когда в диалоговое окно InputBox ничего не будет введено.

 

Sub DemoDinArray()

'объявляем массив без указания размерности

Dim Massiv() As Integer

Dim i As Integer 'Объявляем счетчик

Dim Num 'объявляем переменную Num

i = 0 'Начальное значение счетчика i

'организуем бесконечный цикл,

'т. к. количество вводимых данных заранее неизвестно

Do

i = i + 1

'в диалоговом окне вводим значения для элементов массива

Num = InputBox("Введите элемент массива A(" _

       & i & ")", "Ввод элементов массива")

If Len(Num) = 0 Then Exit Do 'выходим из цикла если в окно

'InputBox ничего не ввели

'изменяем размера массива с сохранением элементов

ReDim Preserve Massiv(i)

'вводим данные в i-й элемент массива

Massiv(i) = Num

Loop

End Sub

 

Рассмотренный способ ввода имеет существенный недостаток: при каждом запуске программы необходимо вновь вводить значения элементов массива. Поэтому при отладке программы или в учебных целях элементы массива можно задавать случайным образом при помощи функции Rnd и оператора Randomize.

 

Оператор Randomize

 

Инициализирует датчик случайных чисел.

 

Синтаксис оператора Randomize

 

Randomize [число]

 

Необязательный аргумент число представляет значение типа Variant или любое допустимое числовое выражение.

Оператор Randomize использует аргумент число для инициализации датчика случайных чисел функции Rnd, передавая ему новое опорное число. Если аргумент число опущен, в качестве нового опорного числа используется значение, возвращаемое системным таймером.

Функция Rnd

 

Возвращает значение типа Single, содержащее случайное число.

Синтаксис функции Rnd

 

Rnd[(число)]

 

Необязательный аргумент число представляет значение типа Single или любое допустимое числовое выражение. Варианты аргумента число и возвращаемые значения функцией Rnd сведены в табл. 7.

 

Таблица 7

 

Число Rnd возвращает
Меньше нуля Каждый раз одно и то же число, используя аргумент число в качестве опорного числа.
Больше нуля Следующее случайное число в последовательности.
Равно нулю Случайное число, возвращенное при предыдущем вызове этой функции.
Не указано Следующее случайное число в последовательности.

 

Функция Rnd возвращает значение, меньшее 1 и большее или равное нулю.

Перед вызовом функции Rnd для инициализации генератора случайных чисел значением, возвращаемым системным таймером можно использовать оператор Randomize без аргумента.

Ниже приведен программный код формулы, предназначенной для получения случайных целых чисел в заданном диапазоне:

 

CInt((верхняяГраница – нижняяГраница + 1) * Rnd + нижняяГраница)

 

Здесь верхняяГраница соответствует максимальному числу в диапазоне, а нижняяГраница - минимальному числу в диапазоне.

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

 

Dim x as Integer

Randomize ' Инициализирует генератор случайных чисел.

x = CInt((6 * Rnd) + 1)'Возвращает случайное число от 1 до 6.

 

Еще один пример показывает, как создается вектор , значения элементов ко­торого расположены в диапазоне от -10 до 25 случайным образом.

 

Sub massiv2()

Dim X(1 to 50) As Single

Dim i As Integer

'Включить генератор случайных чисел

Randomize

For i = 1 To 50

X(i) = -10 + (25 - (-10)) * Rnd

Next i

End Sub

 

Ввод массива можно осуществить с помощью элементов управления формы, таких как List (список), ComboBox (комбинированное поле), которые представляют собой списки элементов. Также для ввода массива можно использовать файлы данных. Кроме того, в приложения Word и Excel ввод массива можно осуществить с помощью таблиц.

Пример. Создать одномерный массив из элементов, находящихся в таблице документа Word.

Допустим, в документе Word имеется таблицы, состоящие из одной колонки или из одной строки со значениями:

 

5
8
4
3
9
2
4

 

2 8 6 3 7 5 6

 

Покажем, как данные из таких таблиц можно присвоить одномерному массиву.

В редакторе VBA вставим модуль, внутри которого поместим процедуру:

 

Sub ReturnCellContentsToArray()

   

Dim intCells As Integer 'Объявляем число ячеек

Dim celTable As Cell 'Объявляем объект - ячейка

Dim sngCells() As Single 'Объявляем динамический массив

Dim intCount As Integer 'индексы массива

'Объявление диапазона внутри ячейки,

' содержимое этого диапазона помещается в массив

Dim rngText As Range

   

'Считывание данных происходит, если в документе

'существует хотя бы одна таблица

If ActiveDocument.Tables.Count >= 1 Then

'Работа внутри диапазона таблицы

With ActiveDocument.Tables(1).Range

   'определение количества ячеек в таблице

   intCells =.Cells.Count

   'переопределение массива

   ReDim sngCells(intCells)

   intCount = 1 'начальный индекс

   'Для каждой ячейки в коллекции ячеек таблицы

   For Each celTable In.Cells

     'Установка диапазона внутри каждой из ячеек

     Set rngText = celTable.Range

     'Т.к. в диапазоне внутри ячейки содержится

     'скрытый символ уменьшаем данный диапазон

     'на один символ

     rngText.MoveEnd Unit:=wdCharacter, Count:=-1

     'присваиваем массиву содержимое диапазона

     'внутри ячейки без скрытого символа

     sngCells(intCount) = CSng(rngText)

     'увеличиваем индекс на единицу

     intCount = intCount + 1

   Next celTable

End With

End If

   

End Sub

 

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

При создании программ часто возникает задача записи в мас­сив значений функции на определенном интервале. В этом случае следует вос­пользоваться динамическим массивом.

Например, создадим программу для записи в массив значений функции при изменении  от 3 до 7 с шагом 0.25.

 

Sub massiv3()

'Объявление динамического массива

Option Base 1

Dim y() As Single

'Индекс определяемого элемента

Dim i As Integer

Dim X As Single

For X = 3 To 7 Step 0.25

' Перейти к следующему элементу

i = i + 1

'Изменить размер массива

ReDim Preserve y(i)

y(i) = Exp(2 - X) + Sqr(X)

Next X

End Sub

 

Для вывода значений элементов одномерного массива необхо­димо организовать цикл по индексу массива, а в цикле вывести значение соот­ветствующего элемента на печать.

В следующем примере элементы массива записываются в переменную str_msg, а затем выводятся в диалоговом окне MsgBox. Предполагается, что выводимый массив уже существует.

 

str_msg = ""

For j = 1 To i - 1

str_msg = str_msg & X(j) & ", "

Next j

 'вызываем стандартное диалоговое окно с кнопкой OK и помещаем надпись

MsgBox "Введено: " & str_msg,, "Вывод массива"

 

Вместо диалогового окна массив можно вывести в объекты Label (метка), TextBox (текстовое поле), List (список), ComboBox (комбинированное поле) на форме, а также в документ Word.

 



Поделиться:


Последнее изменение этой страницы: 2021-11-27; просмотров: 85; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

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