Файл: Особенности и примеры использования массивов при разработке программ.pdf
Добавлен: 28.03.2023
Просмотров: 143
Скачиваний: 2
Введение
Занимаясь программированием, мы достаточно часто сталкиваемся с использованием массивов. У многих эта тема вызывает достаточно много трудностей из-за непонимания того: что из себя представляют массивы и как с ними работать. Однако их использование было, есть и будет одной из наиболее важный частей написания программного кода. Именно поэтому была выбрана эта тема.
Как было сказано выше, массивы очень распространенная вещь. По определению, массив – это нумерованный набор переменных. Переменные в массиве – это элементы массива. Их позиция в массиве задается индексом.
Если понять это не очень просто, то представьте себе «волшебную» коробку. В ней Вы можете создавать сколько угодно отделов и складывать что-то в эти отделы. При необходимости, Вы можете: удалять отделы; создавать новые; вытаскивать и использовать содержимое, которое в них находится; заменять содержимое отдельных отсеков чем-то другим; Вы можете даже хранить в одном из отсеков другой массив, который также содержит разные отделы.
Цель работы – рассмотреть особенности и примеры использования массивов при разработке программ.
Так как массивы по-разному описываются в разных языках программирования, используются разные функции при работе с ними, то примеры использования будут рассмотрены на одном языке программирования – 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 |
– |