Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
VisualFoxPro.doc
Скачиваний:
15
Добавлен:
01.07.2025
Размер:
11 Мб
Скачать
☆

6.1.2. Создание и присваивание массива

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

Массив – это объект языка, содержащий несколько элементов, доступ к элементу осуществляется по имени массива и индексам элемента, например:

declare twoDArray(3, 4)

&& Печатаем элемент twoDArray(2, 3) двумерного массива формы 34,

&& Элемент расположен во второй строке массива и его третьем столбце,

&& то есть имеет индексы равные 2 и 3

? twoDArray(2, 3)

В VFP можно работать как с одномерными массивами (векторами), так и с двумерными (матрицами).

Перед употреблением массив надо создать. Массив, как и скалярные переменные, создается командами LOCAL, PUBLIC, а также командами DECLARE и DIMENSION, например:

&& Создаем одномерный и двумерный массивы

&& Двумерный массив twoDArray имеет 3 строки и 4 столбца

dimension oneDArray(7), twoDArray(3, 4)

или

local oneDArray(7), twoDArray(3, 4)

Можно одновременно употребить LOCAL (PRIVATE, PUBLIC) и DIMENSION (DECLARE):

local oneDArray, twoDArray

dimension oneDArray(7), twoDArray(3, 4)

Массивы, объявленные командой DIMENSION (DECLARE) без использования команд LOCAL и PUBLIC, воспринимаются VFP как PRIVATE-переменные.

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

dimension oneDArray[7], twoDArray[3, 4]

oneDArray[2] = 9

twoDArray[2, 3] = 9

Массив характеризуется формой. Так, oneDArray является массивом формы 7, а twoDArray – это массив формы 34. Каждое измерение массива характеризуется протяженностью. Так, массив формы 34 по первому измерению имеет протяженность равную 3, а по второму – 4.

Одномерный массив oneDArray имеет 7 элементов с именами

oneDArray(1), oneDArray(2), …, oneDArray(7).

Двумерный массив twoDArray имеет 12 элементов с именами

twoDArray(1, 1), …, twoDArray(1, 4) twoDArray(2, 1), …, twoDArray(2, 4) twoDArray(3, 1), …, twoDArray(3, 4).

Замечание. Массив VFP не должен занимать более 2 ГБ (см. в справке разд. System Capacities).

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

store 3 to numberOfRows

numberOfCols = 2 * numberOfRows

declare someArray(numberOfRows, numberOfCols)

Если при задании формы массива использовано нецелое число, то при исполнении берется его целая часть, например:

declare someArray(3.2, 4.8) && Массив формы 34

store 9 to someArray(2, 3)

? someArray(2.25, 3.8) && Напечатает: 9

После создания все элементы массива равны .F. Всем элементам массива можно, если SET COMPATIBLE установлен в OFF (что задано по умолчанию), присвоить одно значение, выполнив команду STORE или употребив оператор присваивания, например:

dimension oneDArray(7), twoDArray(3, 4)

if set("COMPATIBLE") = "ON" then

set compatible off

endif

store 1 to oneDArray

twoDArray = 2

Эти же средства пригодны и для изменения значения одного элемента массива:

store 9 to twoDArray(2, 3)

oneDArray(4) = 9

К двумерному массиву можно обратиться так же, как и к одномерному, а к одномерному, – как к двумерному, например:

store 9 to oneDArray(4), twoDArray(2, 3)

? twoDArray(2, 3) && Напечатает: 9

&& Обращаемся к тому же элементу массива, используя номер элемента

? twoDArray(7) && Напечатает: 9

? oneDArray(1, 4) && Напечатает: 9

Элементы двумерного массива нумеруются построчно. Поэтому нетрудно подсчитать, что порядковый номер элемента twoDArray(2, 3) массива формы 34 равен 7. Можно не обременять себя расчетами, а применить функцию AELEMENT( ), возвращающую номер элемента массива по его индексам.

Форму массива можно изменить по ходу выполнения программы. Если число элементов массива уменьшается, то отбрасываются его последние элементы. Так, в случае двумерного массива twoDArray при изменении его формы с 34 на 23 будут отброшены элементы twoDArray(2, 3), twoDArray(2, 4), twoDArray(3, 1), …, twoDArray(3, 4). В этом легко убедиться, выполнив следующий код:

dimension twoDArray(3, 4) && Все элементы массива равны .F.

store 2 to twoDArray && Все элементы массива равны 2

&& Меняем значения элементов начиная с элемента twoDArray(2, 3) с 2-х на 5

twoDArray(2, 3) = 5

twoDArray(2, 4) = 5

for iCol = 1 to 4

twoDArray(3, iCol) = 5

endFor

&& Уменьшаем размер массива с 34 до 23

dimension twoDArray(2, 3)

&& Печатаем значения всех его элементов

for iRow = 1 to 2

for iCol = 1 to 3

&& Все значения печатаем на одной строке

?? twoDArray(iRow, iCol) && Напечатает: 2 2 2 2 2 2

endFor

endFor

При увеличении числа элементов массива добавленные элементы получат значение .F.

В VFP элементы одного и то же массива могут иметь разный тип, например:

oneDArray(4) = 9

oneDArray(5) = "5-й элемент"

Пример 1. Присвоить каждому элементу массива twoDArray значение, равное номеру строки для этого элемента.

dimension twoDArray(3, 4)

for iRow = 1 to 3

for iCol = 1 to 4

twoDArray(iRow, iCol) = iRow

endFor

endFor

Пример 2. Выводится элемент массива oneDArray, если в массиве twoDArray есть элемент с таким же значением и если его значение не равно .F.

dimension oneDArray(7), twoDArray(3, 4)

store 9 to oneDArray(4), twoDArray(2, 3)

for iRow = 1 to 3

for iCol = 1 to 4

someElement = twoDArray(iRow, iCol)

for k = 1 to 7

&& Нельзя сравнивать значения разных типов

if VarType(oneDArray(k)) = VarType(someElement) then

if VarType(someElement) = 'L' and not someElement then

&& Элементы со значение .F. выводиться не должны

loop

else

if oneDArray(k) = someElement then

&& Печатаем элемент, удовлетворяющий заданным условиям

? someElement

endif

endif

endif

endFor

endFor

endFor

Если быть уверенным, что элементы рассматриваемых массивов имеют один отличный от Logical тип (скажем, Character), то код станет существенно короче:

for iRow = 1 to 3

for iCol = 1 to 4

someElement = twoDArray(iRow, iCol)

for k = 1 to 7

if oneDArray(k) = someElement then

? someElement

endif

endFor

endFor

endFor

Поскольку в общем случае это не так, то перед выполнением команды

if oneDArray(k) = someElement then

нужно убедиться, что сравниваемые значения имеют один тип.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]