Автор Анна Евкова
Преподаватель который помогает студентам и школьникам в учёбе.

Особенности и примеры использования массивов при разработке программ

Содержание:

Введение

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

Как было сказано выше, массивы очень распространенная вещь. По определению, массив – это нумерованный набор переменных. Переменные в массиве – это элементы массива. Их позиция в массиве задается индексом.

Если понять это не очень просто, то представьте себе «волшебную» коробку. В ней Вы можете создавать сколько угодно отделов и складывать что-то в эти отделы. При необходимости, Вы можете: удалять отделы; создавать новые; вытаскивать и использовать содержимое, которое в них находится; заменять содержимое отдельных отсеков чем-то другим; Вы можете даже хранить в одном из отсеков другой массив, который также содержит разные отделы. 

Цель работы – рассмотреть особенности и примеры использования массивов при разработке программ.

Так как массивы по-разному описываются в разных языках программирования, используются разные функции при работе с ними, то примеры использования будут рассмотрены на одном языке программирования – Visual FoxPro.

Особенности использования массивов

Понятие и назначение массивов

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

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

a1, а2, а3, …, аn.

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

Примеры массивов:

  • Х1, Х2, …, Хn  одномерный массив, состоящий из n элементов;
  • А0, А1, А2, …, А10  одномерный массив, состоящий из 11 элементов.

Массивы бывают одномерными  (один индекс), двумерными (два индекса) и т.д.

Структура массива всегда однородна. Массив может состоять из элементов типа integer , real или char , либо других однотипных элементов. Другая особенность массива состоит в том, что к любой его компоненте можно обращаться произвольным образом. Программа может сразу получить нужный ей элемент по его порядковому номеру (индексу). Номер элемента массива называется индексом. Индекс – это значение порядкового типа, определенного, как тип индекса данного массива. Тип индекса определяет границы изменения значений индекса.

Рассмотрим массив Х1, Х2, …, Хn.  Здесь

  • Х – имя массива;
  • 1, 2,…, n – индексы (порядковые номера) элементов;
  • Х7  седьмой элемент массива Х.

Описание массивов на примере языка FoxPro

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

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

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).

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

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

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

Использование массивов при разработке программ

Создание массива

Создание массива

Команда DIMENSION ArrayName1(nRows1 [, nColumns1]) [AS cType]
[, ArrayName2(nRows2 [, nColumns2])] ...

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

Параметры и опция:

ArrayName1, ArrayName2 ... – имена создаваемых массивов.

nRows1 [, nColumns1] – протяженности массива ArrayName1 по первому и второму измерениям (число строк и столбцов массива). Если указывается только nRows1, то создается одномерный массив, если добавляется и nColumns1, то – двумерный.

AS cType – тип массива. Задается, когда нужно указать тип, отличный от Variant. Опция употребляется при передачи массива COM-компоненту. Если тип указан неверно, то VFP устанавливает для массива тип Variant. Данные типа Variant могут передаваться только по ссылке.

Возможные значения параметра c Type и варианты преобразования типа cType приведены в табл. 1.

Таблица 1

Значения cType и варианты преобразования типа, заданного cType

cType

IntelliSense-информация

COM-имя

COM Typelib-имя

.NET system
тип

XSD (SOAP)
тип

Array

Array

SAFEARRAY(type)

Type[ ]

Base64Binary

BinaryMemo

Variant

VARIANT (VT_VARIANT)

System.Object

anyType

Boolean

Logical

Boolean

VARIANT_BOOL (VT_BOOL)

System.Boolean

boolean

Byte

Number

Byte

unsigned char (VT_UI1)

System.Byte

Character

String

String

BSTR (VT_BSTR)

System.String

string

Currency

Currency

Currency

CURRENCY (VT_CY)

Date

Date

Date

DATE (VT_DATE)

System.DateTime

dateTime

DateTime

Date

Date

DATE (VT_DATE)

System.DateTime

dateTime

Decimal

Number

wchar_t (VT_DECIMAL)

System.UInt16

Double

Number

Double

double (VT_R8)

System.Double

double

Float

Variant

VARIANT (VT_VARIANT)

System.Object

anyType

Integer

Number

Long

long (VT_I4)

System.Int32

int

Logical

Logical

Boolean

VARIANT_BOOL (VT_BOOL)

System.Boolean

boolean

Long

Number

Long

long (VT_I4)

System.Int32

int

Memo

Variant

VARIANT (VT_VARIANT)

System.Object

anyType

Number

Number

Double

double (VT_R8)

System.Double

double

Object

Object

Object

IDispatch* (VT_DISPATCH)

System.Object

Short

Number

Long

long (VT_I4)

System.Int32

int

Single

Number

Single

single (VT_R4)

System.Single

String

String

String

BSTR (VT_BSTR)

System.String

string

Variant

Variant

VARIANT (VT_VARIANT)

System.Object

anyType

Void

VOID

Void

void (VT_VOID)

System.IntPtr

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

Элементы двумерного массива располагаются в памяти построчно. Номер строки (столбца) элемента массива по его номеру возвращает функция ASUBSCRIPT( ). Номер элемента массива по его индексам возвращает функция AELEMENT( ).

Функции ADEL( ) и AINS( ) соответственно удаляют и вставляют элементы строки или столбцы массива. Команды APPEND FROM ARRAY, COPY TO ARRAY, SCATTER и GATHER осуществляют обмен данными между массивом и записями таблицы.

По ходу выполнения программы форма массива может быть изменена (путем повторного употребления команды DIMENSION): двумерный массив может быть объявлен как одномерный, и наоборот. Могут быть произвольным образом изменены протяженности по каждому из измерений.

Если двумерный массив объявляется повторно с меньшим числом строк или столбцов, то уменьшение массива производится не по строкам или столбцам, а отбрасываются элементы с номерами, большими нового размера массива. Так, если массив формы 10×10 объявляется как массив формы 10×7, то теряются элементы с номерами 71, 72, …, 100.

При увеличении размера массива новые элементы получают значение .F. Если SET COMPATIBLE установлен в OFF, то значения прежних элементов сохраняются, а если – в ON или DB4, заменяются на .F.

Типизированный массив может быть передан COM-объекту как по ссылке, так и по значению. Объявляя формальный параметр-массив, не следует явно указывать тип объекта, например CommandButton, взамен нужно употреблять Object:

procedure someProc

lparameters aObjects[ ]

dimension aObjects[ ] as CommandButton && Не поддерживается

endProc

procedure someProc

lparameters aObjects[ ]

dimension aObjects[ ] as Object && Рекомендуется

endProc

Для определения способа передачи массива COM-объекту употребляется функция COMARRAY( ).

Пример. Массив aMyArray создается в VFP, а затем передается Visual Basic COM-серверу, ожидающему тип данных Long.

&& Код VFP

dimension aMyArray [10] as Long

&& Передаем массив Visual Basic COM-серверу

lo.FillIntArray(@aMyArray, 100)

' Этот код нужно добавить в Visual Basic CLS-file

' и откомпилировать как COM-компонент

Public Sub FillIntArray(ByRef aInts( ) as Long, iCount as Long)

ReDim aInts(1 to 100)

Dim ii as Integer

For ii = 1 to 100

aInts(ii) = ii

Next

End Sub

Команда DECLARE ArrayName1(nRows1 [, nColumns1]) [AS cType]
[, ArrayName2(nRows2 [, nColumns2])] ...

полностью аналогична команде DIMENSION.

Функции для работы с массивами и примеры их использования

Все рассматриваемые ниже функции имеют параметр ArrayName – имя формируемого или преобразовываемого, или анализируемого функцией массива.

Для функций, извлекающих информацию в массив, справедливо следующее: если массив ArrayName не существует, то он будет создан, если существует, то приобретет форму, необходимую для хранения результата. Если функция не находит необходимых для заполнения массива данных, то несуществующий массив, создан не будет, а существующий останется без изменений.

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

Функция ACLASS(ArrayName, oExpression) заносит в одномерный массив ArrayName имя класса объекта oExpression и имена классов-потомков. Функция возвращает число занесенных в массив элементов.

Пример. Создается класс VectorInit, содержащий метод InitArray, выполняющий инициализацию вектора. На его основе создается класс VectorFunction, содержащий метод DotProduct, возвращающий скалярное произведение двух векторов одной длины. Длина векторов задается свойством arraySize класса VectorInit.

&& Создаем объект типа VectorFunction

vFunc = CreateObject("VectorFunction")

&& Формируем и печатаем массив arrayClassNames

nCount = Aclass(arrayClassNames, vFunc)

for k = 1 to nCount

? arrayClassNames(k)

endFor

&&

&& Напечатает:

&& VectorFunction

&& VectorInit

&& Custom

&&

&& Создаем одномерные массивы arrayA и arrayB

&& Размер массивов

vFunc.ArraySize = 10

dimension arrayA(vFunc.ArraySize), arrayB(vFunc.ArraySize)

&& Выполняем их инициализацию массивов

&& Передаем имена массивов по ссылке

vFunc.InitArray(@arrayA)

vFunc.InitArray(@arrayB)

&& Вычисляем скалярное произведение векторов arrayA и arrayB

&& Массивы должны быть переданы по ссылке

? vFunc.DotProduct(@arrayA, @arrayB)

&&

&& Возможный результат: 2.5671

&& Освобождаем объект vFunc

release vFunc

&& Создаем класс VectorInit

define class VectorInit as Custom

&& ArraySize – свойство класса VectorInit

&& используется для задания размера инициализируемого вектора

ArraySize = 1

&& Инициализация вектора vect размера This.ArraySize случайными числами

procedure InitArray(vect)

for k = 1 to This.ArraySize

vect(k) = Rand( )

endFor

endProc

endDefine

&& Создаем класс VectorFunction; VectorInit – имя класса-родителя

define class VectorFunction as VectorInit

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

function DotProduct(a, b)

dp = 0

for k = 1 to This.ArraySize

dp = dp + a(k) * b(k)

endFor

return dp

endFunc

endDefine

Функция ACOPY(SourceArrayName,DestinationArrayName [,nFirstSourceElement [, nNumberElements [, nFirstDestElement]]]) копирует элементы одного массива в другой. При копировании данные приемника заменяются данными источника. Если массив-приемник не существует, то он будет создан. Форма созданного массива будет совпадать с формой массива-источника. Если массив приемник существует, то он при копировании примет форму массива-источника.

Параметры:

SourceArrayName, DestinationArrayName – соответственно имена массивов источника и приемника данных.

nFirstSourceElement – номер элемента массива-источника, с которого начинается копирование. При отсутствии параметра копирование начинается с первого элемента.

nNumberElements – число копируемых элементов. Если параметр отсутствует или равен 1, то копируются все элементы начиная с nFirstSourceElement.

nFirstDestElement – первый замещаемый элемент массива-приемника.

Функция ACOPY( ) возвращает число скопированных элементов.

Пример. Копируются начиная со второго 3 элемента массива sArray в массив dArray, в котором первым замещается 3-й элемент.

dimension sArray(2, 3), dArray(2, 3)

store "s" to sArray

store "d" to dArray

Acopy(sArray, dArray, 2, 3, 3)

&& Массив dArray:

d

d

s

&&

s

s

d

Функция ADATABASES(ArrayName) заносит имена всех открытых баз данных и пути к файлам баз данных в двумерный массив ArrayName. Первый элемент каждой строки массива содержит имя базы данных, второй – путь к базе данных. Возвращает число строк в результирующем массиве.

Пример:

close databases

open database 'd:\HomeLibrary\HomeLibrary'

Adatabases(arrayDBC)

? arrayDBC(1, 1)

? arrayDBC(1, 2)

close databases

Результат:

HOMELIBRARY

D:\HOMELIBRARY\HOMELIBRARY.DBC

Функция ADBOBJECTS(ArrayName, cSetting) записывает имена соединений, отношений, таблиц и SQL-видов текущей базы данных в массив ArrayName. Если параметр cSetting имеет значение CONNECTION, TABLE или VIEW, то формируется одномерный массив, если RELATION – двумерный. Каждая строка одномерного массива содержит имя соединения, таблицы или SQL-вида, в каждой строке двумерного массива ее 1-й элемент содержит имя дочерней таблицы, 2-й – имя родительской таблицы, 3-й – имя индекса дочерней, а 4-й – имя индекса родительской таблицы. В 5-й элемент записывается информация о ссылочной целостности данных.

Если межтабличная связь не имеет пользовательских правил контроля ссылочной целостности, то элемент содержит 3 символа, соответствующие типу задаваемых в Referential Integrity Builder (см. рис. 2.11) правил контроля ссылочной целостности для обновления, удаления и вставки записей. При этом 1-й символ означает тип правила обновления, 2-й – удаления, а 3-й – вставки. Возможные значения для правил обновления и удаления следующие: "C" – каскадирование, "R" – запрет и "I" – игнорирование. Для правила вставки употребляются только "R" и "I". Так, если для связи заданы следующие правила контроля ссылочной целостности: при обновлении – каскадирование; при удалении – запрет, а при вставке – игнорирование, то 5-й элемент строки массива будет равен "CRI".

В момент исполнения ADBOBJECTS( ) база данных должна быть открыта, в противном случае будет сгенерировано сообщение об ошибке.

Пример:

close databases

open database 'd:\HomeLibrary\HomeLibrary'

declare arrayOfSettings(4)

arrayOfSettings(1) = "CONNECTION"

arrayOfSettings(2) = "TABLE"

arrayOfSettings(3) = "VIEW"

arrayOfSettings(4) = "RELATION"

for k = 1 to 4

if ADBObjects(arrayDBO, arrayOfSettings(k)) > 0 then

&& Печатаем значение cSetting

? arrayOfSettings(k)

display memory like arrayDBO

endif

endFor

close databases

Результат:

ARRAYDBO Priv A test( 1 ) C "AUTHORS"

( 2 ) C "BOOKS"

( 3 ) C "BOOKSCONTENT"

( 4 ) C "BOOKSAUTHORS"

( 5 ) C "WORKTYPE"

RELATION

ARRAYDBO Priv A test

( 1, 1) C "BOOKSAUTHORS"

( 1, 2) C "BOOKS"

( 1, 3) C "BOOKID"

( 1, 4) C "BOOKID"

( 1, 5) C "CRI "

Функция ADEL(ArrayName, nElementNumber [, 2]) удаляет элемент одномерного или строку или столбец двумерного массива ArrayName.

Удаление элементов не приводит к изменению формы массива. При удалении элемента или строки последние элементы соответствующим образом смещаются по направлению к началу массива. На их месте возникают элементы равные .F. При удалении столбца сдвигаются столбцы по направлению к первому столбцу; элементы последнего столбца оказываются равными .F.

Параметр:

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

При успешном удалении функция вернет 1, при неудаче – 0.

Пример. Удаляется элемент одномерного массива: строка, а затем столбец двумерного массива.

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

&& Инициализация массивов

store 4 to oneDArray, twoDArray

for iCol = 1 to 3

&& Изменяем 2-ю строку массива twoDArray

twoDArray(2, iCol) = 5

endFor

Adel(oneDArray, 2) && Результат: 4 4 4 4 4 4 .F.

&& Удаляем 1-ю строку

Adel(twoDArray, 1)

&& Массив twoDArray:

5

5

5

&&

.F.

.F.

.F.

&& Повторная инициализация массива twoDArray

store 7 to twoDArray

&& Удаляем 2-й столбец

Adel(twoDArray, 2, 2)

&& Массив twoDArray:

7

7

.F.

&&

7

7

.F.

Функция ADIR(ArrayName [, cFileSkeleton [, cAttribute [, nFlag]]])

помещает информацию о файлах в массив ArrayName и возвращает число файлов, описанных в массиве.

Результирующий массив имеет 5 столбцов; число строк массива равно числу описанных в нем файлов.

Функция ADLLS(ArrayName) формирует двумерный массив ArrayName, содержащий имена функций, загруженных командой DECLARE – DLL. В каждой строке массива ее первый элемент содержит имя функции, второй – псевдоним функции, третий – имя библиотеки. Тип данных – Character. Функция возвращает число строк результирующего массива.

Функция ADOCKSTATE(ArrayName [, nType | nExtended]) заносит в массив ArrayName вариант прикрепления всех прикрепляемых IDE-окон и панелей инструментов, как системных, так и пользовательских (IDE – integrated development environment). Функция возвращает число строк в результирующем массиве.

Функция AELEMENT(ArrayName, nRowSubscript [, nColumnSubscript]) возвращает номер элемента массива ArrayName по значениям индексов элемента. Если значения индексов превышают протяженности по соответствующим измерениям, то возникнет ошибка исполнения. Номер элемента может быть использован для обращения к двумерному массиву по номеру (то есть как к одномерному), а не по индексам. Индексы элемента по его номеру определяются функцией ASUBSCRIPT( ).

Параметры:

nRowSubscript – в случае двумерного массива номер строки, в которой расположен элемент; в случае одномерного массива – номер элемента, то есть результат функции.

nColumnSubscript – номер столбца, в котором расположен элемент.

Пример:

dimension twoDArray(3, 4)

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

? Asubscript(twoDArray, 7, 1) && Напечатает: 2

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

Функция AERROR(ArrayName) создает массив ArrayName, содержащий сведения о последней ошибке VFP, OLE или ODBC. Массив имеет 7 столбцов. Функция возвращает число строк в созданном массиве. Это число зависит от вида возникшей ошибки.

При возникновении ошибки VFP, OLE или ODBC в столбцах 1 – 7 каждой строки массива находятся приведенные в табл. 2 данные.

Таблица 2

Значения элементов массива ArrayName, созданного AERROR( )

Элемент

Что содержит

Ошибка VFP

1

Номер ошибки, такой же, что и возвращаемый функцией ERROR( )

2

Текст сообщения об ошибке, такой же, что и возвращаемый функцией MESSAGE( )

3

NULL или параметр ошибки, такой же, что и возвращаемый функцией SYS(2018)

4

NULL или номер рабочей области, в которой ошибка произошла

5

NULL или, если триггер отказал (ошибка 1539), одно из следующих значений:
• 1 – ошибка при добавлении данных;
• 2 – ошибка при обновлении данных;
• 3 – ошибка при удалении данных

6, 7

NULL

Ошибка OLE (номера ошибок в VFP 1427 или 1429)

1

Номер ошибки (число 1427 или 1429)

2

Текст VFP-сообщения об ошибке

3

Текст OLE-сообщения об ошибке

4

Имя приложения, например Microsoft Excel

5

NULL или имя Help-файла приложения, содержащего сведения об ошибке

6

NULL или ID (тип – Character) соответствующей темы в Help-файле

7

Номер исключения OLE; тип – Numeric

Ошибка ODBC (номер ошибки в VFP 1526)

1

Номер ошибки (число 1526)

2

Текст VFP-сообщения об ошибке

3

Текст ODBC-сообщения об ошибке

4

Текущее ODBC SQL-состояние; тип – Character

5

Номер ошибки ODBC-источника данных

6

Номер идентификатора соединения ODBC

7

NULL

Функция AEVENTS(ArrayName [, 0 | 1 | oEventObject]) формирует массив ArrayName, содержащий описание события и связанного с ним метода. Возвращает число связываний событий (связывание события объекта – это задание метода некоторого класса в качестве обработчика события).

Параметры:

0 – функция AEVENTS( ) возвращает одномерный массив из 3-х элементов, содержащий приведенные в табл. 3 значения.

Таблица 3

Элементы массива ArrayName, когда второй параметр равен 0

Элемент

Что содержит

Тип

1

Объект-источник события

Object

2

Событие

Character

3

Тип события или как событие вызвано:
0 – системный;
1 – вызвано функцией RAISEEVENT( )
2 – вызов метода

Integer

Если событие является свойством, значение третьего элемента равно 1 или 2. Причем оно равно 2, если значение свойства устанавливается.

1 – функция AEVENTS( ) возвращает двумерный массив с 4-я столбцами, содержащий информацию о сообщении Windows. Массив содержит одну строку для каждого связывания. Элементы строки массива описаны в табл.4.

Таблица 4

Элементы массива ArrayName, когда второй параметр равен 1

Элемент

Что содержит

Тип

1

hWnd

Integer

2

Сообщение Windows

Integer

3

Ссылка или идентификатор

Ссылка на объект

4

Имя связанного метода

Character

oEventObject – ссылка на объект, содержащий метод, установленный в качестве обработчика события (привязанный к событию). При задании параметра AEVENTS( ) возвращает двумерный массив с 5-ю столбцами, содержащими приведенный в табл. 5 сведения.

Таблица 5

Содержимое строки массива ArrayName, когда задан параметр oEventObject

Номер
столбца

Что содержит

Тип

1

.T., если второй элемент – это источник события;
.F., если второй элемент – это идентификатор события

Logical

2

Источник события, если oEventObject – это идентификатор события, или идентификатор события, если oEventObject – это источник события

Ссылка на объект

3

Событие

Character

4

Метод, связанный с событием

"

5

Флаг функции BINDEVENT( )

Integer

Массив ArrayName не изменяется (или не создается), если не существует указанного события; второй параметр равен 0, а AEVENTS( ) вызывается не в момент возникновения события или oEventObject не имеет связанных событий.

Пример. Создается класс OneButtonForm, содержащий один объект – кнопку. Обработчик события Click этой кнопки закрывает, выполняя метод Release, форму. С событием Click кнопки CommandClose формы связывается метод SayWord объекта oHandler типа Inf. При возникновении события Click форма закрывается, однако прежде выполняется метод SayWord: вызывается функция MESSAGEBOX( ), сообщающая "Форма <имя формы> будет закрыта!".

&& Идентификаторы объектов объявляем как PUBLIC

public oForm, oHandler

&& Создаем объект класса OneButtonForm и определяем его свойства:

&& размеры, автоматическое центрирование и видимость

oForm = CreateObject("OneButtonForm")

with oForm

.Width = 300

.Height = 100

.AutoCenter = .T.

.Visible = .T.

&& Определяем свойства кнопки формы: заголовок, размеры и координаты

&& Кнопка в форме центрируется как по горизонтали, так и по вертикали

with .CommandClose

.Caption = "Закрыть"

.Width = 84

.Height = 27

.Left = (oForm.Width – .Width) / 2

.Top = (oForm.Height – .Height) / 2

endWith

endWith

&& Создаем объект типа Inf

oHandler = CreateObject("Inf")

&& Связываем событие Click объекта oForm.CommandClose

&& с процедурой SayWord объекта oHandler

BindEvent(oForm.CommandClose, "Click", oHandler, "SayWord")

&& Формируем массив arrayEvent, содержащий информацию о связанном событии

Aevents(arrayEvent, oHandler)

&& Создаем класс OneButtonForm – форму с одной кнопкой

define class OneButtonForm as Form

add object CommandClose as CommandButton

&&

&& Обработчик события Click кнопки формы

procedure CommandClose.Click

ThisForm.Release

endProc

endDefine

&& Создаем класс Inf, процедура SayWord которого будет выполняться

&& при нажатии на кнопку "Закрыть" формы OneButtonForm

define class Inf as Custom

procedure SayWord

MessageBox("Форма " + _Screen.ActiveForm.Name + " будет закрыта!")

endProc

endDefine

После запуска программы и нажатия на кнопку "Закрыть" на экране появятся 2 окна (рис. 1).

Рис. 1. Вызвана процедура SayWord

Массив arrayEvent, сформированный AEVENTS( ), содержит следующие данные:

.T. (Object) CLICK SAYWORD 0

Функция

AFIELDS(ArrayName [, nWorkArea | cTableAlias])

размещает в массиве ArrayName информацию о структуре таблицы и возвращает число полей в таблице. Результирующий массив содержит 18 столбцов. Число строк массива равно числу полей таблицы.

Параметры:

nWorkArea – номер рабочей области исследуемой таблицы.

cTableAlias – псевдоним исследуемой таблицы.

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

Содержимое каждой строки массива описано в табл. 6; значения в столбцах 10 – 16 появляются только в первой строке массива.

Таблица 6

Содержимое строки массива, формируемого AFIELDS( )

Номер столбца

Что содержит

Тип данных

1

Имя поля

Character

2

Символ, характеризующий тип поля (C – Character, D – Date, L – Logical, M – Memo, N – Numeric, F – Float, I – Integer, B – Double, Y – Currency, T – DateTime, G – General, Q – Varbinary, V – Varchar and Varchar (Binary), W – Blob)

"

3

Длина поля

Numeric

4

Число десятичных знаков

"

5

Разрешение для NULL-значения

Logical

6

Запрет на изменение кодовой страницы

"

7

Выражение проверки поля

Character

8

Текст проверки поля

"

9

Значение поля по умолчанию

"

10

Выражение проверки таблицы

"

11

Текст проверки таблицы

"

12

Длинное имя таблицы

"

13

Выражение триггера вставки

"

14

Выражение триггера обновления

"

15

Выражение триггера удаления

"

16

Комментарий таблицы

"

17

Следующее значение автоматически увеличиваемого поля

Numeric

18

Шаг для автоматического увеличения значения поля

"

Функция AFONT(ArrayName [, cFontName [, nFontSize | nFontCharSet [, nFlags]]]) помещает информацию о доступных шрифтах в массив ArrayName. Возвращает .T., если массив благополучно сформирован, или .F. – в противном случае. Формируемый массив является одномерным. Если задан только параметр ArrayName, то массив заполнится именами доступных шрифтов.

Параметры:

cFontName – имя шрифта, информация о котором помещается в массив. Если шрифт недоступен, то AFONT( ) вернет .F. Если шрифт может принимать дискретные размеры (8, 10, …), то массив будет заполнен возможными значениями размеров шрифта, число элементом массива будет равно числу возможных размеров шрифта. Если шрифт поддерживает дробные размеры, то массив будет состоять из 1-го элемента, равного –1. Тип параметра – Character.

nFontSize – задает размер шрифта cFontName (nFlags отсутствует или равен нулю). Если указанный параметром nFontSize размер шрифта возможен, то массив будет иметь 1 равный .T. элемент и AFONT( ) вернет .T. Если же невозможен, то массив сформирован не будет и AFONT( ) вернет .F. Если параметр отсутствует или равен –1, то массив в случае дискретного шрифта cFontName заполнится возможными значениями его размеров, в случае недискретного в массиве будет 1 равный –1 элемент. Тип параметра – Numeric.

nFontCharSet – задает набор символов шрифта cFontName (nFlags отличен от нуля). Если указанный параметром nFontCharSet набор символов возможен, то массив будет иметь 1 равный .T. элемент и AFONT( ) вернет .T. Если же невозможен, то массив сформирован не будет и AFONT( ) вернет .F. Тип параметра – Numeric.

nFlags – если отсутствует или равен 0, то третий параметр интерпретируется как nFontSize, и – как nFontCharSet – в противном случае. Если nFlags отличен от нуля и nFontCharSet равен –1, то массив заполняется возможными наборами шрифтов.

Пример. Выводятся имена всех дискретных шрифтов. Для первого дискретного шрифта выводятся допустимые размеры и номера доступных наборов символов.

&& Помещаем имена доступных шрифтов в массив fontNamesArray

if Afont(fontNamesArray) then

firstDFont = .T.

for fontNumber = 1 to Alen(fontNamesArray)

&& Имя шрифта

fontName = fontNamesArray(fontNumber)

&& Помещаем информацию о возможных размерах шрифта в массив fontSizeArray

Afont(fontSizeArray, fontName)

if fontSizeArray(1) != –1 then

&& Печатаем имя дискретного шрифта

? fontName

if firstDFont then

firstDFont = .F.

&& Для первого дискретного шрифта массива fontNamesArray

&& печатаем возможные размеры

display memory like fontSizeArray

&& Затем печатаем номера возможных наборов символов

Afont(fontSetArray, fontName, –1, 1)

display memory like fontSetArray

endif

endif

endFor

endif

Возможный результат:

Courier

FONTSIZEARRAY

Priv

A

test

( 1)

N

10

( 10.00000000)

( 2)

N

12

( 12.00000000)

( 3)

N

15

( 15.00000000)

FONTSETARRAY

Priv

A

test

( 1)

N

204

( 204.00000000)

Fixedsys

FoxFont

FoxPro Window Font

MS Sans Serif

MS Serif

Small Fonts

System

Terminal

Функция AINS(ArrayName, nElementNumber [, 2]) вставляет в массив ArrayName элемент, если массив одномерный, или строку или столбец, если массив двумерный.

Добавление элемента (строки, столбца) не изменяет формы массива. При вставке элементы сдвигаются по направлению к концу массива последний элемент (строка, столбец) из массива выпадают. Новый элемент или элементы новой строки (столбца) имеют значения .F.

Возвращает 1, если действие выполнено, или 0 – в противном случае.

Параметр:

nElementNumber – задает положение вставляемого элемента (строки, столбца). В случае одномерного массива новый элемент вставляется перед элементом nElementNumber. В случае двумерного массива новая строка (столбец) вставляется перед строкой (столбцом) с номером nElementNumber. При таком способе вставки номер нового элемента (строки, столбца) равен nElementNumber.

2 – обеспечивает в случае двумерного массива вставку столбца. При отсутствии параметра вставляется строка.

Пример. В массив oneDArray вставляется элемент, а в массив twoDArray – строка, а затем столбец. Значения новых элементов выводятся на экран.

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

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

set compatible off

endif

store .T. to oneDArray, twoDArray

nElementNumber = 2

&& Вставка второго элемента в одномерный массив oneDArray

Ains(oneDArray, nElementNumber)

? oneDArray(nElementNumber) && Напечатает: .F.

&& Переходим в окне вывода на новую строку

?

&& Вставка второй строки в двумерный массив twoDArray

aIns(twoDArray, nElementNumber)

&& Выводим значения элементов во вставленной строке

for iCol = 1 to 4

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

endFor

?

&& Вставка второго столбца в двумерный массив twoDArray

Ains(twoDArray, nElementNumber, 2)

&& Выводим значения элементов во вставленном столбце

for iRow = 1 to 3

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

endFor

Функция AINSTANCE(ArrayName, cClassName) размещает в массиве ArrayName информацию об экземплярах класса cClassName, созданных функциями CREATEOBJECT( ) или NEWOBJECT( ). Возвращает число элементов в сформированном массиве.

В качестве имени класса может быть указано имя как базового класса, так и созданного пользователем. Имена базовых классов VFP см. в табл. 13.2.

Пример.

public oFormA, oFormB

oFormA = CreateObject("OneButtonForm")

oFormB = CreateObject("OneButtonForm")

oFormA.Show

&& Формируем массив arrayIns

Ainstance(arrayIns, "OneButtonForm")

wait arrayIns(1) + ', ' + arrayIns(2) window

&& Создаем класс OneButtonForm – форму с одной кнопкой

define class OneButtonForm as Form

endDefine

Сообщение WAIT WINDOW:

Функция ALANGUAGE(ArrayName, nType) формирует массив ArrayName, содержащий имена всех доступных в VFP команд, функция, базовых классов или DBC-событий. Содержание и форма результирующего массива определяются параметром nType.

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

Alanguage(arrayOfFuncNames, 2)

for k = 1 to Alen(arrayOfFuncNames, 1)

if 'M' $ arrayOfFuncNames(k, 2) then

? arrayOfFuncNames(k, 1), arrayOfFuncNames(k, 2)

endif

next

Результат:

COMPROP

M2-3

CREATEOBJECTEX

M2-3

CURSORTOXML

M2-8

DDEABORTTRANS

M1

DDEADVISE

M4

DDEENABLED

M0-2

DDEEXECUTE

M2-4

DDEINITIATE

M2

DDELASTERROR

M0-1

DDEPOKE

M3-5

DDEREQUEST

M2-4

DDESETOPTION

M1-2

DDESETSERVICE

M2-3

DDESETTOPIC

M2-3

DDETERMINATE

M1

DISPLAYPATH

M2

FORCEEXT

M2

FORCEPATH

M2

GETINTERFACE

M1-3

GETWORDCOUNT

M1-2

GETWORDNUM

M2-3

JUSTDRIVE

M1

JUSTEXT

M1

JUSTFNAME

M1

JUSTPATH

M1

JUSTSTEM

M1

XMLTOCURSOR

M1-3

XMLUPDATEGRAM

M0-3

Функция ALEN(ArrayName [, nArrayAttribute]) возвращает число элементов, строк или столбцов в массиве ArrayName.

Параметр:

nArrayAttribute – принимает следующие значения:

0 (или опущен) – функция вернет число элементов в массиве;

1 – функция вернет число строк в массиве;

2 – функция в случае двумерного массива вернет число столбцов в массиве, а в случае одномерного массива – 0.

Пример. Печатаются имена файлов и поддиректорий, отобранных в массив fileArray.

&& Устанавливаем директорию по умолчанию

set default to c:

&& Формируем массив fileArray, занося в него описания системных и скрытых файлов,

&& а также поддиректорий корневого каталога диска с:

if Adir(fileArray, "", "DHS") > 0 then

&& Вывод имен файлов и поддиректорий

&& для определения верхней границы цикла FOR используем ALEN( )

for iRow = 1 to Alen(fileArray, 1)

fileName = fileArray(iRow, 1)

fileAtributes = fileArray(iRow, 5)

do case

case "D" $ fileAtributes

? "Папка ", fileName

case "S" $ fileAtributes

? "Системный" + Iif("H" $ fileAtributes, ", скрытый", "") + " файл", fileName

case "H" $ fileAtributes

? "Скрытый файл ", fileName

endCase

endFor

endif

Возможный результат:

Папка WINDOWSСистемный скрытый файл BOOTFONT.BIN

Системный скрытый файл NTLDR

Системный скрытый файл NTDETECT.COM

Системный скрытый файл BOOT.INI

Папка DOCUMENTS AND SETTINGS

Папка PROGRAM FILES

Функция ALINES(ArrayName, cExpression [, nFlags] [cParseChar [, cParseChar2 [, …]]]) копирует каждую строку cExpression в соответствующий элемент одномерного массива ArrayName. Возвращает число элементов в результирующем массиве.

По сравнению с функцией MLINES( ), позволяющей выполнить аналогичные действия, ALINES( ) работает быстрее, программы с ALINES( ) более компактны и, кроме того, на функционирование ALINES( ) не оказывает влияния установка команды SET MEMOWIDTH.

Параметры:

cExpression – символьное выражение или memo-поле, строки которого копируются в массив. Могут быть использованы 2-байтовые символьные строки.

Если cExpression – это пустая строка или NULL-значение, то результирующий массив будет состоять из одного элемента, содержащего пустую строку.

Если cExpression имеет тип Varbinary или Blob, то ALINES( ) создает массив с элементами типа Varbinary.

nFlags – принимает приведенные в табл. 6.12.

Таблица 6.12

Значения параметра nFlags

Бит

nFlags (сумма)

Описание

0

1

По умолчанию. Удаляет ведущие и хвостовые пробелы в строке; для типов Varbinary и Blob удаляет ведущие и хвостовые нулевые байты

1

2

Включает элемент в массив, даже если элемент пустой

2

4

Не включает пустые элементы в массив

3

8

Задает чувствительные к регистру символы конца строки

4

16

Включает символы конца строки в массив

Функция APROCINFO(ArrayName, cFileName [, nType]) формирует массив ArrayName, содержащий элементы встроенного языка VFP, имеющиеся в PRG-файле cFileName. Возвращает число строк результирующего массива. Параметр nType задает вид информации, записываемой в массив ArrayName. Действие параметра описано в табл. 7.

Таблица 7

Действие параметра nType

nType

Что содержит массив

Состав строки массива

Номер
столбца

Что содержит

0

Описания всех элементов языка

1

Имя элемента

2

Номер строки в файле

3

Вид элемента

4

Отступ (используется с директивами #IF для описания их уровня вложенности)

1

Описания определений классов

1

Имя класса

2

Номер строки в файле

3

Родительский класс

4

Является ли OLE-объектом

2

Описания процедур классов

1

Имя процедуры, имеющее в качестве префикса имя класса

2

Номер строки в файле

3

Описания директив компилятора

1

Имя, определяемое директивой

2

Номер строки в файле

3

Вид директивы

По умолчанию nType = 0.

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

Define, если элемент – это директива #DEFINE;

Directive в случае иной директивы компилятора;

Class, если элемент – это определения класса

Procedure, если элемент – это процедура, функция, событие или метод.

Функция полезна на этапе разработки программ и их последующего документирования.

Пример. Функция APROCINFO( ) применяется для анализа следующей программы, хранящейся в файле d:\ProcForProcInfo.prg.

&& Файл d:\ProcForProcInfo.prg

clear

&&

#define NTIMES 3

&&

oAB = CreateObject("APlusB")

&& Идентификатор объекта должен передаваться по ссылке

c = FindC(0, 3, @oAB)

? c

&& Освобождаем объект oAB

release oAB

&&

define class APlusB as Custom

A = 1

B = 2

function AandB

return This.A + This.B

endFunc

endDefine

&&

function FindC(a, b, oAB)

oAB.A = a

oAB.B = b

c = 0

for k = 1 to NTIMES

c = c + oAB.AandB( )

oAB.A = oAB.A + 1

oAB.B = oAB.B + 1

endFor

return c

endFunc

Для вывода результата использован следующий, помещенный в файл d:\goAProcInfo.prg код:

&& Файл d:\goAProcInfo.prg

&& Вызываем APROCINFO( ) с различными значениями параметра nType

for nType = 0 to 3

?

? 'nType = ', nType

&& Формируем массив arrayPRG

AProcInfo(arrayPRG, 'd:\ProcForProcInfo.prg', nType)

for iRow = 1 to Alen(arrayPRG, 1)

? && Переход на новую строку

&& Выводим элементы строки iRow массива на одной строке окна вывода

for iCol = 1 to Alen(arrayPRG, 2)

?? arrayPRG(iRow, iCol), ' '

next

next

next

Результат:

nType = 0 (элементы)

NTIMES

3

Define

0

APlusB AS Custom

10

Class

0

APlusB.AandB

13

Procedure

0

findC

18

Procedure

0

nType = 1 (класс)

APlusB

10

Custom

nType = 2 (процедура)

APlusB.AandB

13

nType = 3 (директива)

NTIMES

3

Define

Функция ASCAN(ArrayName, eExpression [, nStartElement [, nElementsSearched [, nSearchColumn [, nFlags]]]]) ищет в массиве ArrayName элемент равный eExpression. В случае удачи возвращает номер первого найденного элемента (или номер строки массива); возвращает 0, если поиск не дал результатов. Если нужно независимо использовать параметр nSearchColumn, то для nStartElement и nElementsSearched задаются отрицательные значения. Если нужно независимо использовать параметр nFlags, то вдобавок значение nSearchColumn устанавливается меньшим нуля.

Как и в других функциях значения параметров не должны приводить к нарушению границ массива.

В случае символьных данных по умолчанию поиск чувствителен к регистру имеющихся в eExpression букв.

Параметры:

eExpression – значение для поиска. Возможен любой тип данных.

nStartElement – номер элемента, с которого начинается поиск. В случае двумерного массива номер элемента по его индексам можно получить, употребив AELEMENT( ). При отсутствии параметра поиск ведется с первого элемента.

nElementsSearched – число просматриваемых элементов. При отсутствии параметра поиск ведется вплоть до последнего элемента.

nSearchColumn – номер столбца, в котором ведется поиск. Полезен, в частности, при работе с массивом, созданным функцией AFIELDS( ). Если параметр меньше нуля или равен ему, то поиск ведется во всем массиве (с учетом ограничений, устанавливаемых nStartElement и nElementsSearched). Если положителен, то поиск ведется в столбце nSearchColumn начиная с элемента nStartElement; число участвующих в поиске элементов равно nElementsSearched. Так, в случае массива twoDArray формы 3×4 вызов Ascan(twoDArray, 9, 2, 2, 3) обеспечит поиск равных числу 9 элементов в третьем столбце среди второго и третьего элементов столбца. Вызов Ascan(twoDArray, 9, 2, 3, 3) недопустим, поскольку приводит к нарушению верхней границы третьего столбца.

nFlags – задает дополнительные условия поиска. Принимает значения от 1 до 15 включительно. При наличии параметра функция ASCAN( ) интерпретирует в соответствии с табл. 8 каждый бит параметра.

Таблица 8

Биты параметра nFlags

Бит

Условия поиска, если значение бита равно 1

0

Поиск нечувствителен к регистру

1

При поиске SET EXACT установлен в ON; действует, если 2-й бит имеет значение 1

2

Позволяет изменять (на время поиска) системную EXACT-настройку; если значение бита 0, то при поиске используется системная EXACT-настройка

3

В случае двумерного массива функция ASCAN( ) возвращает номер первой строки, имеющей искомый элемент

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

Таблица 9

Условия поиска, задаваемые параметром nFlags

nFlags

Биты

Описание

0

0000

Ищет по правилам, существовавшим в VFP версии 6 и в более ранних версиях

1

0001

Нечувствителен к регистру

2

0010

Ищет по правилам, существующим начиная с версии 7 VFP

3

0011

Нечувствителен к регистру

4

0100

Exact OFF

5

0101

Нечувствителен к регистру, EXACT OFF

6

0110

EXACT ON

7

0111

Нечувствителен к регистру, EXACT ON

8

1000

Возвращает номер строки

9

1001

Нечувствителен к регистру, возвращает номер строки

10

1010

Возвращает номер строки

11

1011

Нечувствителен к регистру, возвращает номер строки

12

1100

Возвращает номер строки, EXACT OFF

13

1101

Нечувствителен к регистру, возвращает номер строки, EXACT OFF

14

1110

Возвращает номер строки, EXACT ON

15

1111

Нечувствителен к регистру, возвращает номер строки, EXACT ON

Пример 1. В одном и том же массиве для найденного элемента сначала возвращается его номер, а затем номер строки.

n = 3

dimension twoDArray(n, n)

for iCol = 1 to n

for iRow = 1 to n

twoDArray(iCol, iRow) = iCol

next

next

&& Массив twoDArray

&&

1

1

1

&&

2

2

2

&&

3

3

3

&& Функция вернет номер элемента

for iCol = 1 to n

?? Ascan(twoDArray, iCol) && Напечатает: 1 4 7

next

?

&& Функция вернет номер строки

for iCol = 1 to n

?? Ascan(twoDArray, iCol, –1, –1, –1, 8) && Напечатает: 1 2 3

next

Функция ASELOBJ(ArrayName, [ 1 | 2 | 3 ]) помещает сведения о текущем элементе управления или контейнере, определенном в проектировщике формы или класса, в массив ArrayName.

При вызове без второго параметра в массив ArrayName заносятся ссылки на выбранные элементы управления. Тип ссылки – Object. Число элементов массива равно числу выбранных элементов управления.

Возвращает 1 при успешном выполнении или 0 – в противном случае.

Параметр:

1 – формируется массив из одного элемента, содержащего ссылку на контейнер выбранного элемента управления.

2 – формируется массив из одного элемента, содержащий ссылку на объект DataEnvironment выбранной формы. Получив эту ссылку, можно, например, изменить свойства объекта.

3 – формирует массив из трех элементов, содержащий контекст текущего окна редактирования данных: ссылка на контейнер объекта, полное имя SCX- или VCX-файла и имя INCLUDE-файла, если таковой имеется.

Функция ASESSIONS(ArrayName) формирует одномерный массив ArrayName, содержащий номера сессий данных. Возвращает число сессий данных. Пример см. в разд. 2.5.12.

Функция ASORT(ArrayName [, nStartElement [, nNumberSorted [, nSortOrder [, nFlags]]]) сортирует элементы массива ArrayName в возрастающем или убывающем порядке. Все участвующие в сортировке элементы должны быть одного типа. Возвращает 1, если сортировка выполнена, или –1 – в противном случае.

Параметры:

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

Пример. Сортируется по возрастанию двумерный массив формы 4×3 начиная с 4-го элемента, то есть элемента с индексами (2, 1).

Пусть после создания и заполнения

dimension someArray(4, 3)

for k = 1 to 12

someArray(k) = (12 – k) * (-1)**k

endFor

получается следующий массив:

-11

10

-9

8

-7

6

-5

4

-3

2

-1

0

Поскольку элемент, с которого начинается сортировка, расположен во втором ряду, то первый ряд в сортировке участвовать не будет. Сортируются элементы первого столбца, элементы прочих столбцов перемещаются вслед за элементами сортируемого столбца. Поэтому сортировка Asort(someArray, 4) даст следующий результат:

11

10

-9

-5

4

-3

2

-1

0

8

-7

6

nNumberSorted – число сортируемых элементов в одномерном массиве и число сортируемых столбцов в двумерном. Если nNumberSorted опущен или равен –1, то в случае одномерного массива в сортировке участвуют все элементы начиная с nStartElement, в случае двумерного массива в сортировке участвуют все столбцы начиная со столбца, в котором присутствует элемент с номером nStartElement.

nSortOrder – задает порядок сортировки. Если nSortOrder опущен или отрицателен, или равен нулю, то элементы массива сортируются по возрастанию своих значений. Если nSortOrder > 0, то элементы располагаются в убывающем порядке.

nFlags – задает чувствительную, если равен нулю, или нечувствительную, если равен единице, к регистру сортировку. Однако поскольку ASORT( ) использует последовательность сортировки, заданную SET COLLATE, то параметр nFlags имеет действие, если SET COLLATE задана последовательность, чувствительная к регистру, например "MACHINE". Тогда задание nFlags = 1 обеспечит нечувствительную к регистру сортировку. Если же SET COLLATE установлена нечувствительная к регистру последовательность, например, "GENERAL", то задание nFlags = 0 не будет иметь эффекта.

Заключение

В работе были рассмотрены особенности массивов и примеры их использования.

Основное назначение массивов – быстрая обработка данных. Часто разработчики программного обеспечения выполняют с их помощью сортирование информации, манипулирование исходными данными и получение различных выборок из наборов данных. Бытует мнение, что функциональность массивов гораздо проще организовать с помощью применения "толстой" прослойки SQL-кода и обращения к внешним приложениям типа специализированных хранилищ данных. Конечно, такой подход позволяет более просто реализовать элементарные вещи, но вас может ждать небольшое разочарование заказчика в плане быстродействия всего приложения. Представьте себе наиболее часто выполняемые задачи при выводе информации в аналитических системах предприятий - сортировка фамилий сотрудников, выбор товаров в каком-либо ценовом пределе, формирование списка категорий торговых менеджеров вашей организации, хранение оперативных данных о курсе валют. Поскольку выполнение таких элементарных задач (обычно) требует наличия SQL-хранилищ исходной информации и обращения к базам данных, работоспособность и скорость ваших приложений часто зависят от надежности и быстродействия технологического решения SQL-хранилища. Действительно, в случае применения отказоустойчивой системы хранения данных, размещенной на нескольких серверах, использование хранилища данных типа MySQL представляет собой узкое звено всей системы. Представьте себе, что может произойти, если разнесенные рабочие места обращаются к единой информационной таблице с курсами валют, которую по какой-либо причине заблокировало другое неверно работающее приложение. Да и простое обращение сотен компьютеров к одной таблице может очень сильно повредить быстродействию всего процесса работы аналитической системы, написанной на основе использования единого SQL-хранилища данных.

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

Список использованной литературы

  1. Агальцов, В.П. Базы данных. В 2-х т. Т. 2. Распределенные и удаленные базы данных: Учебник / В.П. Агальцов. - М.: ИД ФОРУМ, НИЦ ИНФРА-М, 2013. - 272 c.
  2. Гамма Э., Хелм Р., Джонсон Р., Влиссидес Дж. Приемы объектно-ориентированного проектирования. Паттерны проектирования. - СПб.:Питер, 2015. – 368 с.
  3. Голицына, О.Л. Базы данных: Учебное пособие / О.Л. Голицына, Н.В. Максимов, И.И. Попов. - М.: Форум, 2012. - 400 c.
  4. Давыдова Е. М. Базы данных Учеб. пособие для вузов / Е. М. Давыдова, Н. А. Новгородова. - 3-е изд., перераб. и доп. - Томск : В-Спектр, 2012. - 128 с.
  5. Дейт К.Дж. Введение в системы баз данных. - К.: Диалектика, 2012. - 360 c.
  6. Илюшечкин В. Основы использования и проектирования баз данных. Учебник. - М.:Юрайт, 2014. - 214с.
  7. Карпова, И.П. Базы данных: Учебное пособие / И.П. Карпова. - СПб.: Питер, 2013. - 240 c.
  8. Кириллов, В.В. Введение в реляционные базы данных.Введение в реляционные базы данных / В.В. Кириллов, Г.Ю. Громов. - СПб.: БХВ-Петербург, 2012. - 464 c.
  9. Малыхина М. Базы данных. Основы, проектирование, использование. - СПб.: БХВ-Петербург, 2012. - 528с.
  10. Марков А.С., Лисовский К.Ю. Базы данных. Введение в теорию и методологию: Учебник. – М.: Финансы и статистика, 2015. – 512 с.
  11. Озкарахан Э. Машины баз данных и управление базами данных. - М.: Мир, 2013. - 551 c.
  12. Пирогов, В.Ю. Информационные системы и базы данных: организация и проектирование: Учебное пособие / В.Ю. Пирогов. - СПб.: БХВ-Петербург, 2014. - 528 c.
  13. Советов, Б.Я. Базы данных: теория и практика: Учебник для бакалавров / Б.Я. Советов, В.В. Цехановский, В.Д. Чертовской. - М.: Юрайт, 2013. - 463 c.
  14. Туманов В.Е. Основы проектирования реляционных баз данных - М.: Бином, 2012. - 420 c.
  15. Фуфаев, Э.В. Базы данных: Учебное пособие для студентов учреждений среднего профессионального образования / Э.В. Фуфаев, Д.Э. Фуфаев. - М.: ИЦ Академия, 2012. - 320 c.
  16. Хаббард Дж. Автоматизированное проектирование баз данных - М.: Мир, 2014. - 453 c.