Массивы

До сих пор мы сталкивались в основном с простыми типами данных. Теперь давайте поговорим о сложных типах данных. Одним из примеров сложных типов являются массивы. Вспомним главу 4: массивы являются представителями сложных типов данных, а именно структурированных сложных типов.

Рассмотрение структурированных типов мы начнем с так называемых массивов "ARRAY". Массив объединяет элементы одного типа данных. Массивы бывают одномерными и многомерными. Размер массива (и число измерений) ограничивается только объемом рабочей памяти ПЭВМ.

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

Декларация (объявление)  одномерного массива выглядит следующим образом:

Var имя_массива: array[нач_инд...кон_инд] of тип_данных;

Например:

Var mas: array[1..25] of Integer;

Таким образом мы объявили одномерный массив mas целых чисел. Номер (индекс) первого элемента 1, последний номер (индекс) 25.

Декларация массивов может производиться и немного другим способом. Сначала объявляется тип пользователя (в нашем случае типа "array"), а затем и переменная на основе этого типа данных. Например:

Type tab=array[1..25] of Integer;

Var mas:tab;

Эта декларация аналогична приведенной выше. В следующем примере декларировано несколько переменных типа массив:

Var mas_1:array[1..10] of Real;

       mas_2:array[5 .. 16] of Integer;

       sst:array[20..40] of Char;

Обратите внимание, что величины, обозначающие "начальный индекс" и "конечный индекс", в квадратных скобках разделяются двумя (!) точками, причем перед этими двумя точками и после них допускаются пробелы.

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

В следующем примере объявлены массивы, содержащие элементы различных типов, и индексы различных простых типов:

Var mas:array [1..15] of Real; {Описан массив из 15 вещественных чисел}

       www:array[(mon,tue,wed)] of Integer; {Описан массив из трех целых чисел, индексы элементов массива имеют перечисляемый тип и принимают значение названий дней недели: mon, tue, wed}

       ast:array['A'..'Z'] of Boolean; {Описан массив элементов логического типа, тип индексов — ограниченный символьный}

       art:array[(black,white)] of 11..20; {Описан массив целых чисел с индексами black, white. Каждый элемент массива может принимать значения от 11 до 20}

       svz:array[byte] of Integer; {Описан массив из 256 целых чисел с индексами стандартного типа byte (от 0 до 256)}

Ввод массива

Для ввода массива обычно используется один из двух компоненто: TStringGrid, TMemo. Мы рассмотрим компонент TStringGrid.

TStringGrid — таблица строк

Компонент TStringGrid предназначен для создания таблиц, в ячейках которых располагаются произвольные текстовые строки. Он является прямым потомком TDrawGrid (произвольная таблица), от которого им унаследовано большинство свойств и методов.

Таблица делится на две части - фиксированную и рабочую. Фиксированная служит для показа заголовков столбцов/рядов и для ручного управления их размерами. Обычно фиксированная часть занимает крайний левый столбец и самый верхний ряд таблицы, однако с помощью свойств FixedCols и FixedRows можно задать другое количество фиксированных столбцов и рядов (если эти свойства имеют 0, таблица не содержит фиксированной зоны). Рабочая часть - это остальная часть таблицы. Она может содержать произвольное количество столбцов и рядов, более того, эти величины могут изменяться программно. Рабочая часть может не умещаться целиком в пределах окна компонента, в этом случае в него автоматически помещаются нужные полосы прокрутки. При прокрутке рабочей области фиксированная область не исчезает, но меняется ее содержимое - заголовки строк и рядов.

Центральным свойством компонента является Cells - двухмерный массив ячеек, каждая из которых может содержать произвольный текст. Конкретная ячейка определяется парой чисел - номером столбца и номером ряда, на пересечении которых она находится (нумерация начинается с нуля). Свойство cells имеет тип String, поэтому программа может легко прочитать или записать содержимое нужной ячейки. Например:

Cells [1,1] := 'Левая верхняя ячейка рабочей зоны';

Количество ячеек по каждому измерению хранит пара свойств Colcount (количество столбцов) и RowCount (количество рядов). Значения-этих свойств и, следовательно, размеры таблицы могут меняться как на этапе разработки программы, так и в ходе ее работы, однако их значения должны быть как минимум на единицу больше соответственно значений в свойства FixedCois и FixedRows, определяющих размеры фиксированной зоны.

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

Свойства компонента:

property BorderStyle: TBorderStyle;

Определяет рамку компонента: bsNone нет рамки; bsSingle - рамка толщиной 1 пиксель

property Cells[ACol, ARow: Integer] :String;

Определяет содержимое ячейки с табличными координатами (ACol, ARow)

property Col: Longint;

 

 

Содержит номер столбца сфокусированной ячейки

property ColCount: Longing-

Содержит количество столбцов таблицы

property Cols[Index: Integer]:

TStrings;

Содержит все строки колонки с индексом Index

property ColWidths[Index: Longint] : Integer;

Содержит ширину столбца с индексом Index

property DefaultColWidth: Integers;

Содержит умалчиваемое значение ширины столбца

property DefaultDrawing: Boolean;

 

 

Разрешает/запрещает автоматическую прорисовку служебных элементов таблицы - фиксированной зоны, фона и прямоугольника сфокусированной ячейки и

т. п.

property DefaultRowHeight: Integers;

Содержит умалчиваемую высоту рядов

property EditorMode: Boolean;

Разрешает/запрещает редактирование ячеек. гнорируется, если свойство Options включает goAlwayseShowEditor или не включает goEditing

property FixedColor: TColor;

Определяет цвет фиксированной зоны

property FixedCois: Integers;

Определяет количество столбцов фиксированной зоны

property FixedRows: Integers;

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

property GridHeight: Integers;

Содержит высоту таблицы

property GridLineWidth: Integers;

 

 

Определяет толщину линий, расчерчивающих таблицу

property GridWidth: Integers;

Содержит ширину таблицы

property LeftCol: Longint;

Содержит номер самого левого столбца, видимого в зоне прокрутки

property Objects [ACols ARow: Integer] : TObject;

Обеспечивает доступ к объекту, связанному с ячейкой (ACol, ARow)

property Options: TGridOptions;

Содержит параметры таблицы (см. ниже)

property Row: Longing;

Содержит номер ряда сфокусированной ячейки

property RowCount: Longint;

Содержит количество рядов таблицы

property RowHeights[Index: Long int] : Integer;

Содержит высоту ряда с индексом index

property Rows[Index: Integer]: TStrings;

Содержит все строки ряда с индексом

Index

type TScrollStyle = (ssNone,

ssHorizontal, ssVertical,

ssBoth) ;

Определяет полосы прокрутки: ssNone -нет полос; ssHorizontal - в таблицу вставляется горизонтальная полоса;

property ScrollBars: TScroll

Style;

ssVertical - вставляется вертикальная

полоса; ssBoth - вставляются обе полосы

TGridRect = record

case Integer of

0: (Left,Top,Right,Bottom: Long int) ;

1: (TopLeft,

BottomRight: TGridCoord) ;

end;

Определяет группу выделенных ячеек в

координатах левая верхняя и правая

нижняя ячейки(нумерация столбцов и рядов идет от нуля, включая столбцы и

ряды фиксированной зоны). После выделения сфокусированной окажется правая нижняя ячейка

property Selection: TGridRect;

property TabStops[Index: Long int] : Boolean;

Разрешает/запрещает выбирать столбец с индексом index при обходе ячеек клавишей Tab. Игнорируется, если Options не содержит goTabs

property TopRow: Longint;

Содержит номер самого верхнего ряда, видимого в прокручиваемой зоне ячеек

property VisibleColCount: Integer;

Содержит количество столбцов, полностью видимых в зоне прокрутки

property VisibleRowCount: Integer;

Содержит количество рядов, полностью видимых в зоне прокрутки

Для компонента определен тип TGridOptions (при его использовании активируются все необходимые (стандартные) для использования компонента свойства):

type

TGridOption = (goFixedVertLine, goFixedHorzLine, goVertLine, goHorzLine, goRangeSelect, goDrawFocusSelected, goRowSizing, goColSizing, goRowMoving, goColMoving, goEditing, goTabs, goRowSelect, goAlwaysShowEditor, goThumbTracking);

TGridOptions = set of TGridOptions;

Элементы множества TGridOptions имеют следующий смысл:

goFixedVertLine

Столбцы фиксированной зоны разделяются вертикальными линиями

goFixedHorzLine

Ряды фиксированной зоны разделяются горизонтальными линиями

goVertLine

Столбцы рабочей зоны разделяются вертикальными линиями

goHorzLine

Ряды рабочей зоны разделяются горизонтальными линиями

goRangeSelect

Разрешено выделение нескольких ячеек. Игнорируется, если включен элемент goEdit

goDrawFocus Selected

Разрешено выделять сфокусированную ячейку так же, как выделенные

goRowSizing goColSizing goRowMoviog

Разрешено ручное (мышью) изменение высоты строк Разрешено ручное изменение ширины рядов Разрешено ручное перемещение рядов (нажать левую кнопку мыши на фиксированной ячейке перемещаемого ряда и, удерживая кнопку нажатой, переместить ряд на новое место)

goColMoving goEditing

Разрешено ручное перемещение столбца Разрешено редактирование ячейки. Игнорируется, если включен элемент goRowSelect. Редактирование начинается после щелчка мыши или нажатия клавиши F2 и завершается при щелчке по другой ячейке или нажатии клавиши Enter

goTabs goRowSelect

Разрешено обходить ячейки клавишей Tab (Shift+Tab) Обязывает выделять сразу все ячейки ряда и запрещает редактирование ячеек Разрешено редактировать сфокусированную ячейку: редактирование возможно после выбора ячейки клавишей Tab (Shift+Tab). Игнорируется, если не включен элемент goEditing

goAlwaysShowEditorgoThumbTracking

Разрешено обновление при прокрутке. Если этот элемент отсутствует, обновление ячеек произойдет только после окончания прокрутки

 Пример ввода массива с использованием TStringGrid при вводе одномерного целого числового массива:

Procedure TForm1.Button1Click(Sender:TObject);

Type mas=array[1..10] of Integer;

Var a:mas;

       i:Integer;

Begin

For i:=1 to 10 do

a[i]:=StrToInt(StringGridN.Cells[i,1]); {Более подробно мы рассмотрим операцию присваивания ниже}

End;

Извлечение и присвоение в массивах

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

mas[2]:=34;

элементу массива с индексом 2 присваивается значение 34. Оператор

LabelN.Caption:=IntToStr(mas[2]);

вызовет на экран пользователя значение хранящегося в элементе-ячейке №2 массива mas. Наряду с конкретным значением (константой) в качестве индекса может быть использована переменная, например, при обработке массива поэлементно в рамках цикла "For…todo". Так с помощью фрагмента программы

For i:=1 to 25 do mas[i]:=0;

всем элементам массива присваивается значение "0".

Использование массивов вместо одиночных переменных позволяет вамблагодаря применению циклов "For…todo" существенно сэкономить время и объем программы. Это демонстрируется следующим примером.

Пример. Дана последовательность реальных чисел s1 … s30. Организовать массив для хранения этих чисел. Определить сумму этих элементов.

Решение.

Интерфейс.

 

В инспекторе объектов для компонента StringGrid1 задаем следующие свойства:

ColCount — 31;

RowCount — 2;

Options → goEditing — True.

Программный код:

Procedure TForm1.Button1Click(Sender:TObject);

Type mas=array[1..30] of Real;      {Декларация массива}

Var a:mas;

       i:Integer;  {Параметр цикла For}

       s:real;       {Сумма элементов}

Begin

For i:=1 to 30 do     {Заполнение массива}

a[i]:=StrToFloat(StringGrid1.Cells[i,1]);

s:=0;                {Обнуление счетчика суммы}

For i:=1 to 30 do     {Вычисление суммы}

s:=s+a[i];

Label1.Caption:=FloattoStr(s);

End;

Контрольные вопросы:

1.      Какие типы данных вы знаете?

2.      Перечислите и приведите примеры простых типов данных.

3.      Перечислите сложные типы данных.

4.      Что такое массив?

5.      что называют элементом массива?

6.      Что называют индексом элемента массива?

7.      Сколько элементов может содержать массив?

8.      Сколько индексов может быть у одного элемента массива?

9.      Элементы какого типа может содержать массив?

10.  Какие типы данных допустимы для индексов элементов массива?

 

На главную.
Используются технологии uCoz