Array — Ключевое слово Delphi


Содержание

Объявление массива

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

Имя: array [нижний_индекс. .верхний_индекс] of тип

  • имя — имя массива;
  • array — зарезервированное слово языка Delphi, обозначающее, что объявляемое имя является именем массива;
  • нижний_индекс и верхний_и«декс — целые константы, определяющие диапазон изменения индекса элементов массива и, неявно, количество элементов (размер) массива;
  • тип — тип элементов массива.

Примеры объявления массивов:

При объявлении массива удобно использовать именованные константы. Именованная константа объявляется в разделе объявления констант, который обычно располагают перед разделом объявления переменных. Начинается раздел объявления констант словом const. В инструкции объявления именованной константы указывают имя константы и ее значение, которое отделяется от имени символом «равно». Например, чтобы объявить именованную константу нв, значение которой равно 10, в раздел const надо записать инструкцию: нв=ю. После объявления именованной константы ее можно использовать в программе как обычную числовую или символьную константу. Ниже в качестве примера приведено объявление массива названий команд-участниц чемпионата по футболу, в котором используются именованные константы.

NT = 18; // число команд

SN = 25; // предельная длина названия команды var

team: array[1..NT] of string[SN];

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

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

Имя:array [нижний_индекс..верхний_индекс] of тип = (список);

где список — разделенные запятыми значения элементов массива. Например:

a: array[10] of integer = (0,0,0,0,0,0,0,0,0,0);

Team: array[1..5] of String[10]=

Обратите внимание, что количество элементов списка инициализации должно соответствовать размерности массива. Если это будет не так, то компилятор выведет сообщения об ошибке: Number of elements differs from declaration (количество элементов не соответствует указанному в объявлении).

При попытке инициализировать локальный массив компилятор выводит сообщение об ошибке: Cannot initialize local variables (локальная переменная не может быть инициализирована). Локальный массив можно инициализировать только во время работы программы, например, так:

НОВОСТИ ФОРУМА
Рыцари теории эфира
01.10.2020 — 05:20: ВОСПИТАНИЕ, ПРОСВЕЩЕНИЕ, ОБРАЗОВАНИЕ — Upbringing, Inlightening, Education ->
[center][Youtube]69vJGqDENq4[/Youtube][/center]
[center]14:36[/center]
Osievskii Global News
29 сент. Отправлено 05:20, 01.10.2020 г.’ target=_top>Просвещение от Вячеслава Осиевского — Карим_Хайдаров.
30.09.2020 — 12:51: ВОСПИТАНИЕ, ПРОСВЕЩЕНИЕ, ОБРАЗОВАНИЕ — Upbringing, Inlightening, Education ->
[center][Ok]376309070[/Ok][/center]
[center]11:03[/center] Отправлено 12:51, 30.09.2020 г.’ target=_top>Просвещение от Дэйвида Дюка — Карим_Хайдаров.
30.09.2020 — 11:53: ВОСПИТАНИЕ, ПРОСВЕЩЕНИЕ, ОБРАЗОВАНИЕ — Upbringing, Inlightening, Education ->
[center][Youtube]VVQv1EzDTtY[/Youtube][/center]
[center]10:43[/center]

интервью Раввина Борода https://cursorinfo.co.il/all-news/rav.
мой телеграмм https://t.me/peshekhonovandrei
мой твиттер https://twitter.com/Andrey54708595
мой инстаграм https://www.instagram.com/andreipeshekhonow/

[b]Мой комментарий:
Андрей спрашивает: Краснодарская синагога — это что, военный объект?
— Да, военный, потому что имеет разрешение от Росатома на манипуляции с радиоактивными веществами, а также иными веществами, опасными в отношении массового поражения. Именно это было выявлено группой краснодарцев во главе с Мариной Мелиховой.

[center][Youtube]CLegyQkMkyw[/Youtube][/center]
[center]10:22 [/center]

Доминико Риккарди: Россию ждёт страшное будущее (хотелки ЦРУ):
https://tainy.net/22686-predskazaniya-dominika-rikardi-o-budushhem-rossii-sdelannye-v-2000-godu.html

Завещание Алена Даллеса / Разработка ЦРУ (запрещено к ознакомлению Роскомнадзором = Жид-над-рус-надзором)
http://av-inf.blogspot.com/2013/12/dalles.html

[center][b]Сон разума народа России [/center]

[center][Youtube]CLegyQkMkyw[/Youtube][/center]
[center]10:22 [/center]

Доминико Риккарди: Россию ждёт страшное будущее (хотелки ЦРУ):
https://tainy.net/22686-predskazaniya-dominika-rikardi-o-budushhem-rossii-sdelannye-v-2000-godu.html

Завещание Алена Даллеса / Разработка ЦРУ (запрещено к ознакомлению Роскомнадзором = Жид-над-рус-надзором)
http://av-inf.blogspot.com/2013/12/dalles.html

[center][b]Сон разума народа России [/center]

Array — Ключевое слово Delphi

При создании любой серьёзной программы не обойтись без дополнительных, более сложных, чем числа и строки, типов данных. В Delphi программист может для своих целей конструировать собственные типы данных. Чтобы ввести в программу (описать) новый тип данных, применяется оператор с ключевым словом type:
type название_типа = описание_типа;

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

type FootballTeam = (Spartak, Dinamo, CSKA, Torpedo, Lokomotiv);
var MyTeam: FootballTeam;
begin
MyTeam:=Spartak;
end;

Вообще, под перечислимыми типами понимают все типы, для которых можно определить последовательность значений и их старшинство. К ним относятся:

  • все целочисленные типы, для которых всегда можно указать число, следующее за числом N;
  • символьные типы (Char): за символом ‘a’ всегда следует ‘b’, за ‘0’ следует ‘1’, и так далее;
  • логические типы — тип Boolean также представляет собой перечислимый тип: type Boolean = (false, true);

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

  • массивы
  • записи
  • множества

Массив — это структура данных, доступ к элементам которой осуществляется по номеру (или индексу). Все элементы массива имеют одинаковый тип.
Описание массива имеет вид:

type имя_типа_массива = array [диапазон] of тип_элемента;

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

type TMyArray = array [1 .. 100] of Integer;

Теперь можно описать переменные типа TMyArray:

var A, B: TMyArray;

Вместо присвоения типа можно явно описать переменные как массивы:

var A, B : array [1..100] of Integer;


Для доступа к элементу массива нужно указать имя массива и индекс элемента в квадратных скобках. В качестве индекса может выступать число, идентификатор или выражение, значение которых должно укладываться в диапазон, заданный при описании массива:

Иногда требуется узнать верхнюю или нижнюю границу массива. Для этого служат встроенные функции:

High() — вернёт число, являющееся верхней границей массива;
Low() — вернёт число, являющееся нижней границей массива.

В скобки нужно подставить массив, границы которого требуется узнать.

Выражение B := A означает, что каждый элемент массива B будет равен элементу с таким же индексом массива A. Такое присвоение возможно только если оба массива объявлены через некий поименованный тип, или перечислены в одном списке. И в случае:

его использовать невозможно (но возможно поэлементное присвоение B[1] := A[2]; и т.д.).

Массивы могут иметь несколько измерений, перечисляемых через запятую. Например, таблицу из четырёх столбцов и трёх строк:

1 2 3 4
5 6 7 8
9 10 11 12

можно описать в виде массива с двумя измерениями:

type MyTable = array[1..4, 1..3] of Integer;
var X : MyTable;
Y : Integer;
begin
Y:=X[3, 2];
end;

Теперь в результате операции присвоения Y будет равен 7.
Многомерный, например, двумерный массив можно описать как массив массивов:

type TMyArray = array [1 .. 4] of array [1 .. 3] of Integer;

Результат будет аналогичен предыдущему примеру.
Каждое измерение многомерного массива может иметь свой собственный тип, не обязательно целый.
Кроме вышеописанных, так называемых статических массивов, у которых количество элементов неизменно, в Delphi можно использовать динамические массивы, количество элементов в которых допускается изменять в зависимости от требований программы. Это позволяет экономить ресурсы компьютера, хотя работа с такими массивами происходит гораздо медленнее. Описываются динамические массивы аналогично статическим, но без указания диапазона индексов:

type TDinArray = array of Integer;
var A : TDinArray;

После создания в динамическом массиве нет ни одного элемента. Необходимый размер задаётся в программе специальной процедурой SetLength. Массив из ста элементов:

Нижняя граница динамического массива всегда равна нулю. Поэтому индекс массива A может изменяться от до 99.
Многомерные динамические массивы описываются именно как массивы массивов. Например, двумерный:

type T3DinArray = array of array of Integer;
var A : T3DinArray;

В программе сначала задаётся размер по первому измерению (количество столбцов):

SetLength(A, 3);

Затем задаётся размер второго измерения для каждого из трёх столбцов, например:

SetLength(A[0], 3);
SetLength(A[1], 2);
SetLength(A[2], 1);


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

  • функция Length— определяющая длину массива;
  • функция High— возвращающая наибольший индекс массива;
  • функция Lowвозвращающая наименьший индекс массива;

Продемонстрируем теперь на примере, работу функции lehgth и возможность изменения размера массива. Для этого напишем программу, в которой мы в Edit будем вводить желаемый размер массива, и по нажатию кнопки, label нам покажет, что введенный размер, нашему массиву присвоен.

1) Кидаем на форму компоненты Label, Button и Edit;

2) Свойство Caption у label и Text у Edit1 ставим в , a в свойстве Caption у Button запишем фразу: — Задать размер;

3) Создаем обрабочик событий OnClick на кнопке, объявляем наш массив и записываем следующий код:

4) Запускаем проект, и убеждаемся, что можем теперь задавать практически любой размер нашему массиву, вводя числа в Edit, и нажимая на кнопку.

Теперь продемонстрируем на примере один из способов задания размера и автоматического заполнения элементов динамических массивов. Напишем программу, в которой в первый Edit, мы будем вводить размер массива, во второй Edit значение его элементов. А по нажатию на кнопку, компонент Мемо — отобразит нам, как размерность массива, так и содержание его элементов.

1) Кидаем на форму 2 компонента Edit, один — Button и один — Memo;

2) В свойстве Text у Edit1 и Edit2 — записываем 0, очищаем свойство Lines компонента Memo, а в свойство Caption у Button запишем слово: Вычислить;

3) Создаем обработчик событий OnClick на Button, и пишем следующее:

Массивы в Delphi (структурные типы данных)

Массивом называется упорядоченная индексированная совокупность однотипных элементов, имеющих общее имя. Элементами массива могут быть данные различных типов, включая структурированные. Каждый элемент массива однозначно определяется именем массива и индексом (номером этого элемента в массиве) или индексами, если массив многомерный. Для обращения к отдельному элементу массива указываются имя этого массива и индекс (индексы) элемента, заключенный в квадратные скобки, например, arr1 [3, 35], arr1 [3] [35] или аrr3 [7].

Количество индексных позиций определяется размерностью массива (одномерный, двумерный и т. д.), при этом размерность не ограничивается. В математике аналогом одномерного массива является вектор, а двумерного— матрица. Индексы элементов массива должны принадлежать порядковому типу. Разные индексы одного и того же массива могут иметь различные типы. Чаще всего индекс имеет целочисленный тип.

Различают массивы статические и динамические.

Статический массив

Статический массив представляет собой массив, границы индексов и, соответственно, размеры которого задаются при объявлении, т. е. они известны еще до компиляции программы. Формат описания типа статического массива:

Практикум по delphi — работа с массивами

Тема 4. Программирование с использованием массивов

Цель лабораторной работы: изучить свойства компонента TStringGrid. Написать программу с использованием массивов.

4.1. Работа с массивами

Массив есть упорядоченный набор однотипных элементов, объединенных под одним именем. Каждый элемент массива обозначается именем, за которым в квадратных скобках следует один или несколько индексов, разделенных запятыми, например: a[1], bb[I], c12[I, j*2], q[1,1,I*j-1].. В качестве индекса можно использовать любые порядковые типы за исключением LongInt.

Тип массива или сам массив определяются соответственно в разделе типов (Type) или переменных (Var) с помощью ключевого слова Array следующим образом:

Array [описание индексов] of

Примеры описания массивов:

Const N=20; // Задание максимального значения индекса;

Type TVector=array[1..N] of real; // Описание типа одномерного массива;

Var a:TVector; // А – массив типа Tvector;

Ss:array[1..10] of integer; // Ss – массив из десяти целых чисел;

Y:array[1..5,1..10] of char; // Y – двумерный массив символьного типа.

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

4.2. Компонент TStringGrid

При работе с массивами ввод и вывод информации на экран удобно организовывать в виде таблиц. Компонент TStringGrid предназначен для отображения информации в виде двумерной таблицы, каждая ячейка которой представляет собой окно однострочного редактора (аналогично окну TEdit). Доступ к информации осуществляется с помощью свойства Cells[ACol, ARow: Integer]: string, где ACol, Arow — индекс элемента двумерного массива. Свойства ColCount и RowCount устанавливают количество строк и столбцов в таблице, а свойства FixedCols и FixedRows задают количество строк и столбцов фиксированной зоны. Фиксированная зона выделена другим цветом, и в нее запрещен ввод информации с клавиатуры.

4.3. Порядок выполнения задания

Задание: создать программу для определения вектора , где А — квадратная матрица размерностью NxN, а Y, B – одномерные массивы размерностью N. Элементы вектора Y определяются по формуле . Значения N вводить в компонент TEdit, А и B — в компонент TStringGrid. Результат, после нажатия кнопки типа TButton, вывести в компонент TStringGrid.

Панель диалога приведена на рис. 4.1.

Настройка компонента TStringGrid

Для установки компонента TStringGr >


Текст программы приведен ниже.

Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,

procedure FormCreate(Sender: TObject);

procedure Button1Click(Sender: TObject);

procedure Button2Click(Sender: TObject);

Nmax=10; // Максимальная размерность массива

Mas2 = array[1..Nmax,1..Nmax] of extended; // Объявление типа двумерного массива размерностью Nmax

Mas1 = array[1..Nmax] of extended; // Объявление типа одномерного массива размерностью Nmax

A : Mas2; // Объявление двумерного массива

B, Y : Mas1; // Объявление одномерных массивов

procedure TForm1.FormCreate(Sender: TObject);

N:=3; // Размерность массива

for i:=1 to N do begin

procedure TForm1.Button1Click(Sender: TObject);

for i:=1 to N do begin

procedure TForm1.Button2Click(Sender: TObject);

A[i, j]:=StrToFloat(StringGrid1.Cells[j, i]);

for i:=1 to N do begin

for j:=1 to N do s:=s+A[i, j]*B[j];

4.4. Индивидуальные задания

Во всех заданиях по теме «Массивы» скалярные переменные вводить с помощью компонента TEdit с соответствующим пояснением в виде компонента TLabel. Скалярный результат выводить в виде компонента TLabel. Массивы представлять на форме в виде компонентов TStringGrid, в которых 0-й столбец и 0-ю строку использовать для отображения индексов массивов. Вычисления выполнять, после нажатия кнопки типа TВutton.

1. Задана матрица размером NxM. Получить массив B, присвоив его k-му элементу значение 0, если все элементы k-го столбца матрицы нулевые, и значение 1 в противном случае.

2. Задана матрица размером NxM. Получить массив B, присвоив его k-му элементу значение 1, если элементы k–й строки матрицы упорядочены по убыванию, и значение 0 в противном случае.

3. Задана матрица размером NxM. Получить массив B, присвоив его k-му элементу значение 1, если k-я строка матрицы симметрична, и значение 0 в противном случае.

4. Задана матрица размером NxM. Определить k – количество “особых” элементов матрицы, считая элемент “особым”, если он больше суммы остальных элементов своего столбца.

5. Задана матрица размером NxM. Определить k – количество “особых” элементов матрицы, считая элемент “особым”, если в его строке слева от него находятся элементы, меньшие его, а справа – большие.

6. Задана символьная матрица размером NxM. Определить k — количество различных элементов матрицы (т. е. повторяющиеся элементы считать один раз).

7. Дана матрица размером NxM. Упорядочить ее строки по неубыванию их первых элементов.

8. Дана матрица размером NxM. Упорядочить ее строки по неубыванию суммы их элементов.

9. Дана матрица размером NxM. Упорядочить ее строки по неубыванию их наибольших элементов.

10. Определить, является ли заданная квадратная матрица n-го порядка симметричной относительно побочной диагонали.

11. Для матрицы размером NxM вывести на экран все ее седловые точки. Элемент матрицы называется седловой точкой, если он является наименьшим в своей строке и одновременно наибольшим в своем столбце или, наоборот.

12. В матрице n-го порядка переставить строки так, чтобы на главной диагонали матрицы были расположены элементы, наибольшие по абсолютной величине.

13. В матрице n-го порядка найти максимальный среди элементов, лежащих ниже побочной диагонали, и минимальный среди элементов, лежащих выше главной диагонали.

14. В матрице размером NxM поменять местами строку, содержащую элемент с наибольшим значением со строкой, содержащей элемент с наименьшим значением.

15. Из матрицы n-го порядка получить матрицу порядка n-1 путем удаления из исходной матрицы строки и столбца, на пересечении которых расположен элемент с наибольшим по модулю значением.

16. Дан массив из k символов. Вывести на экран сначала все цифры, входящие в него, а затем все остальные символы, сохраняя при этом взаимное расположение символов в каждой из этих двух групп.

17. Дан массив, содержащий от 1 до k символов, за которым следует точка. Вывести этот текст в обратном порядке.

18. Дан непустой массив из цифр. Вывести на экран цифру, наиболее часто встречающуюся в этом массиве.

19. Отсортировать элементы массива X по возростанию.

20. Элементы массива X расположить в обратном порядке.

21. Элементы массива X циклически сдвинуть на k позиций влево.

22. Элементы массива X циклически сдвинуть на n позиций вправо.


23. Преобразовать массив X по следующему правилу: все отрицательные элементы массива перенести в начало, а все остальные – в конец, сохраняя исходное взаимное расположение, как среди отрицательных, так и среди остальных элементов.

24. Элементы каждого из массивов X и Y упорядочены по неубыванию. Объединить элементы этих двух массивов в один массив Z так, чтобы они снова оказались упоряченными по неубыванию.

25. Дан массив из k символов. Определить, симметричен ли он, т. е. читается ли он одинаково слева направо и справа налево.

26. Дано два массива. Найти наименьшее среди тех элементов первого массива, которые не входят во второй массив.

27. Определить количество инверсий в этом массиве X (т. е. таких пар элементов, в которых большее число находится слева от меньшего: xi>xj при i ’ ‘ then begin // Если встретился символ после пробела

n:=n+1; // Число слов увеличивается на единицу

1 : if st[i]=’ ‘ then ind:=0; // Если встретился пробел после символов

Label3.Caption:=IntToStr(n); // Вывод числа слов в Label3

5.7. Индивидуальные задания

Во всех заданиях исходные данные вводить с помощью компонента TEdit в компонент TListBox либо с помощью свойства Text в свойство Items компонента TComboBox. Скалярный результат выводить c помощью компонента TLabel. Ввод строки заканчивать нажатием клавиши Enter. Для выхода из программы использовать кнопку Close. Для расчетов вводить несколько различных строк.

1. Дана строка, состоящая из групп нулей и единиц. Каждая группа отделяется от другой одним или несколькими пробелами. Найти количество групп с пятью символами.

2. Дана строка, состоящая из групп нулей и единиц. Найти и вывести на экран самую короткую группу.

3. Дана строка, состоящая из групп нулей и единиц. Подсчитать количество символов в самой длинной группе.

4. Дана строка, состоящая из групп нулей и единиц. Найти и вывести на экран группы с четным количеством символов.

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

6. Дана строка, состоящая из букв, цифр, запятых, точек, знаков “+” и “-“. Выделить подстроку, которая соответствует записи целого числа (т. е. начинается со знака “+” или “-“ и внутри подстроки нет букв, запятых и точек).

7. Дана строка символов, состоящая из букв, цифр, запятых, точек, знаков “+” и “-“. Выделить подстроку, которая соответствует записи вещественного числа с фиксированной точкой

8. Дана строка символов, состоящая из букв, цифр, запятых, точек, знаков “+” и “-“. Выделить подстроку, которая соответствует записи вещественного числа с плавающей точкой

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

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

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

12. Дана строка символов, состоящая из произвольного текста на английском языке, слова разделены пробелами. Вывести на экран порядковый номер слова, накрывающего k-ю позицию (если на k-ю позицию попадает пробел, то номер предыдущего слова).

13. Дана строка символов, состоящая из произвольного текста на английском языке, слова разделены пробелами. Разбить исходную строку на две подстроки, причем первая длиной k-символов (если на k-ю позицию попадает слово, то его следует отнести ко второй строке, дополнив первую пробелами до k-позиций).

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

15. Дана строка символов, состоящая из произвольного текста на английском языке, слова разделены пробелами. Вывести на экран порядковый номер слова минимальной длины и количество символов в этом слове.

16. Дана строка символов, состоящая из произвольного текста на английском языке, слова разделены пробелами. В каждом слове заменить первую букву на прописную.

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

18. Дана строка символов, состоящая из произвольного текста на английском языке, слова разделены пробелами. Поменять местами i— и j-е слова.

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

20. Дана строка символов, состоящая из произвольного текста на английском языке, слова разделены пробелами. Заменить буквы латинского алфавита на соответствующие им буквы русского алфавита.

21. Дана строка символов S S …S , в которой могут встречаться цифры, пробелы, буква “E” и знаки “+”, “-“. Известно, что первый символ S является цифрой. Из данной строки выделить подстроки, разделенные пробелами. Определить, является ли первая подстрока числом. Если да, то выяснить: целое или вещественное число, положительное или отрицательное.

Array — Ключевое слово Delphi

Школа программирования Delphi

Портал DelphiSchool является бесплатным проектом, обеспечивающим пользователям быстрый и легкий доступ к урокам программирования на Delphi. Сайт позволяет научиться программировать на Делфи любому, кто хочеть писать свои программы, игры, Android приложения, программы для MAC OC или IOS. Кроме уроков Delphi и статей Delphi, на сайте доступны также и видеоуроки. Практически к каждому уроку, пользователю доступен исходник, изучив который, он сможет наглядно посмотреть как работает та или иная программа, написанная на Делфи. Кроме того мы постараемся прилагать к каждому материалу (статье, уроку, видеоуроку) файлы Delphi, которые будут помогать изучить предоставленный материал.

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

Комбинаторика в Delphi. Как определить все перестановки в массиве.

Несмотря на то, что тема поста относится больше не к программированию, а к математике, определение всех перестановок в массиве (неважно какого типа) может потребоваться и при работе в Интернет. Простой пример — определть все возможные названия сайтов, составленных из 3 ключевых слов. Или провести синонимизацию какого-либо участа текста, используя заданные массивы слов-синонимов. Что касается количества перестановок, то тут все просто — количество перестановок будет равно факториалу количества элементов в массиве, т.е., если у нас есть массив M, то количество перестановок k будет равно:
k = Length(M)!
для трехэлементного массива k=1*2*3=6
для четырех элементов: k=1*2*3*4=24 и т.д.
Осталось только вывести все возможные перестановки.

Чтобы продемонстрировать вариант перебора всевозможных перестановок зададимся простой целью:
Есть набор чисел: 1, 2, 3. Необходимо вывести все возможные перестановки этих чисел.
Итак на входе у нас будет массив (1,2,3).
Нам надо переставить числа так, чтобы в итоге все числа выставились в ряд: 3, 2, 1.
Для достижения поставленой цели нам потребуется:

  1. Вспомогательная функция определения количества перестановок (вычисления факториала числа). Хоть у нас и есть чётко заданый масси, следует учитывать будущее этого алгоритма — вывести перестановки для массивов любой длины.
  2. Функция получения следующей перестановки.
  3. Функция перемещения двух элементов в массиве.

Самое простое — то написать функцию перестановки двух элементов в массиве (первая задача на первом курсе по информатике):

Array — Ключевое слово Delphi

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


type FootballTeam = (Spartak, Dinamo, CSKA, Torpedo, Lokomotiv);
var MyTeam: FootballTeam;
begin
MyTeam:=Spartak;
end;

Вообще, под перечислимыми типами понимают все типы, для которых можно определить последовательность значений и их старшинство. К ним относятся:
все целочисленные типы, для которых всегда можно указать число, следующее за числом N;
символьные типы (Char): за символом ‘a’ всегда следует ‘b’, за ‘0’ следует ‘1’, и так далее;
логические типы — тип Boolean также представляет собой перечислимый тип: type Boolean = (false, true);
Структурные типы данных используются практически в любой программе. Это такие типы, как
массивы
записи
множества

Массив — это структура данных, доступ к элементам которой осуществляется по номеру (или индексу). Все элементы массива имеют одинаковый тип.
Описание массива имеет вид:

type имя_типа_массива = array [диапазон] of тип_элемента;

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

type TMyArray = array [1 .. 100] of Integer;

Теперь можно описать переменные типа TMyArray:

var A, B: TMyArray;

Вместо присвоения типа можно явно описать переменные как массивы:

var A, B : array [1..100] of Integer;

Для доступа к элементу массива нужно указать имя массива и индекс элемента в квадратных скобках. В качестве индекса может выступать число, идентификатор или выражение, значение которых должно укладываться в диапазон, заданный при описании массива:

var N: Integer;
begin
N := 65;
A[5] := 101;
A[N] := 165;
A[N+3] := 200;
B := A;
end;

Иногда требуется узнать верхнюю или нижнюю границу массива. Для этого служат встроенные функции:

High() — вернёт число, являющееся верхней границей массива;
Low() — вернёт число, являющееся нижней границей массива.

В скобки нужно подставить массив, границы которого требуется узнать.

Выражение B := A означает, что каждый элемент массива B будет равен элементу с таким же индексом массива A. Такое присвоение возможно только если оба массива объявлены через некий поименованный тип, или перечислены в одном списке. И в случае:

var A: array[1..100] of String;
B: array[1..100] of String;

его использовать невозможно (но возможно поэлементное присвоение B[1] := A[2]; и т.д.).

Массивы могут иметь несколько измерений, перечисляемых через запятую. Например, таблицу из четырёх столбцов и трёх строк:
1 2 3 4
5 6 7 8
9 10 11 12
можно описать в виде массива с двумя измерениями:

type MyTable = array[1..4, 1..3] of Integer;
var X : MyTable;
Y : Integer;
begin
Y:=X[3, 2];
end;

Теперь в результате операции присвоения Y будет равен 7.
Многомерный, например, двумерный массив можно описать как массив массивов:

type TMyArray = array [1 .. 4] of array [1 .. 3] of Integer;

Результат будет аналогичен предыдущему примеру.
Каждое измерение многомерного массива может иметь свой собственный тип, не обязательно целый.
Кроме вышеописанных, так называемых статических массивов, у которых количество элементов неизменно, в Delphi можно использовать динамические массивы, количество элементов в которых допускается изменять в зависимости от требований программы. Это позволяет экономить ресурсы компьютера, хотя работа с такими массивами происходит гораздо медленнее. Описываются динамические массивы аналогично статическим, но без указания диапазона индексов:

type TDinArray = array of Integer;
var A : TDinArray;

После создания в динамическом массиве нет ни одного элемента. Необходимый размер задаётся в программе специальной процедурой SetLength. Массив из ста элементов:

begin
SetLength(A, 100);
end;

Нижняя граница динамического массива всегда равна нулю. Поэтому индекс массива A может изменяться от 0 до 99.
Многомерные динамические массивы описываются именно как массивы массивов. Например, двумерный:

type T3DinArray = array of array of Integer;
var A : T3DinArray;

В программе сначала задаётся размер по первому измерению (количество столбцов):

Затем задаётся размер второго измерения для каждого из трёх столбцов, например:

SetLength(A[0], 3);
SetLength(A[1], 2);
SetLength(A[2], 1);

Таким образом создаётся треугольная матрица: A00 A10 A20
A01 A12
A02
Чтобы освободить память, выделенную динамическому массиву, нужно массиву как целому присвоить значение nil:
A:=nil;
Ключевое слово nil в Delphi означает отсутствие значения.

Записи очень важный и удобный инструмент. Даже не применяя специальные технологии, с его помощью можно создавать собственные базы данных. Записи — это структура данных, каждый элемент которой имеет собственное имя и тип данных. Элемент записи иначе называют поле. Описание записи имеет вид:
type имя_типа_записи = record
название_поля : тип_поля ;
. . .
название_поля : тип_поля ;
end;
Названия полей, имеющих одинаковый тип, можно, как и в случае описания переменных, указывать в одну строку через запятую. Для обращения к полю записи сначала указывают имя записи, затем точку, затем имя поля. Например, данные о персонале предприятия могут быть организованы таким типом записи:

type TPers = record
Fam, Name, Par : String;
Year : Integer;
Dep : String;
end;
var Pers : TPers;
begin
Pers.Fam:=’Иванов’;
Pers.Name:=’Иван’;
Pers.Par:=’Иванович’;
Pers.Year:=1966;
Pers.Dep:=’Цех №1′;
end;

Теперь осталось записать эти данные в файл, предварительно объявив и его тип как TPers, и база данных готова. С файлом в Delphi также ассоциируется переменная, называемая файловой переменной, которая описывается так:
VFile : file of тип_файла;
В качестве типа может использоваться любой ограниченный тип Delphi. При этом не допускается тип String, так как он допускает переменный размер до 2 ГБайт. Его необходимо ограничивать: String[N], где N — количество символов. Тип TPers из предыдущего примера должен быть описан, например, так:

type TPers = record
Fam, Name, Par : String[20];
Year : Integer;
Dep : String[10];
end;

Теперь переменная такого типа занимает строго определённое место в памяти, и может быть записана в файл. Как это сделать, рассказывается во 2-й части Урока №7.

Множество — это группа элементов, объединённая под одним именем, и с которой можно сравнивать другие величины, чтобы определить, принадлежат ли они этому множеству. Количество элементов в одном множестве не может превышать 256. Множество описывается так:

type имя_множества = set of диапазон_значений_множества ;

В качестве диапазона может указываться любой тип, количество элементов в котором не больше 256. Например:

type TMySet = set of 0 .. 255;
type TMySet = set of Byte;

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


var MySet : TMySet;
begin
MySet:=[1, 3 .. 7, 9];
end;

Чтобы проверить, является ли некое значение элементом множества, применяется оператор in в сочетании с условным оператором:

var Key : Char;
Str : String;
begin
if Key in [‘0’ .. ‘9’, ‘+’, ‘-‘] then Str:=’Math’;
end;

Чтобы добавить элемент во множество, используется операция сложения, удалить — вычитания:

var Digit: set of Char=[‘1’..’9′];
var Math: Set of Char;
begin
Math:=Digit+[‘+’, ‘-‘, DecimalSeparator*];
end;

Типы массивов в Delphi

Типы массивов в Delphi

В Delphi имеется три типа поддерживаемых языком массивов. Первый — стандартный массив, который объявляется с помощью ключевого слова array. Второй тип был впервые введен в Delphi 4 в качестве имитации того, что было давным-давно доступно в Visual Basic, — динамический массив, т.е. массив, длина которого может изменяться в процессе выполнения кода.

И последний тип массивов, как правило, не считается массивом, хотя в языке Object Pascal имеется несколько его вариаций. Конечно, мы говорим о строках: однобайтных строках (тип shortstring в 32-разрядной версии Delphi), строках с завершающим нулем (тип Pchar) и длинных строках в 32-разрядных версиях Delphi (которые имеют отдельную вариацию для «широких» символов).

Все массивы имеют одну и ту же структуру. Они состоят из одного или большего количества повторений другого типа данных, например, char, integer или record, которые в памяти находятся рядом друг с другом. Именно это последнее свойство стандартных массивов позволяет очень быстро получить доступ к отдельным элементам массивов. Весь процесс доступа к элементу сводится к простому вычислению адреса, для чего требуются, как мы вскоре увидим, всего несколько машинных инструкций.

Можно даже не сомневаться, что все вы знаете стандартный способ объявления массивов в Delphi. Так, объявление

MyIntArray : array [0..9] of integer;

создает массив из 10 элементов типа integer. В языке Object Pascal диапазон изменения индексов элементов можно выбирать любым (в приведенном случае — от 0 до 9). В следующем примере объявляется еще один массив из 10 элементов типа integer, но здесь индексация элементов следует от 1 до 10:

MyIntArray : array [1..10] of integer;

Некоторые считают, что работать с массивом, объявленном во втором примере, удобнее (в конце концов, первый элемент имеет индекс 1).

Тем не менее, нужно сказать несколько слов о работе с массивами, индексация которых начинается с нуля. Во-первых, очень часто в API-интерфейсах операционных систем Windows и Linux, а также Delphi-библиотеках VCL и CLX предполагается, что первый элемент в массиве имеет индекс 0. Кроме того, в языках программирования С, С++ и Java индексация всех массивов обязательно начинается с 0. Поскольку и Windows, и Linux реализованы на С (или С++), при вызове API-функций считается, что индекс первого элемента массива равен 0.

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

В-третьих, если вы передаете массивы в качестве параметров функциям (скоро мы перейдем к рассмотрению открытых массивов), то функция Low (которая возвращает индекс первого элемента массива) внутри некоторой функции будет возвращать 0 независимо от того, как массив объявлен вне этой функции. (Обратите внимание, что сказанное было справедливо для всех версий Delphi на момент написания книги; в будущих версиях, возможно, будет введена возможность индексирования элементов массивов в функциях по реальным индексам.)

Еще один момент, о котором необходимо помнить, — для основных типов массивов, элементы которых располагаются в памяти непрерывно, вычисление адреса элемента N (т.е. элемента MyArray[N]) в случае индексации с 0 производится по следующему выражению:

AddressOfArray + (N * sizeof(ElementType));

Если же индексация массива начинается с X, то адрес элемента N будет вычисляться в соответствии с выражением:

AddressOfArray + ((N — X) * sizeof(ElementType));

Как видите, в последнем случае выражение несколько сложнее. Несмотря на то что вычисление адреса каждого отдельного элемента лишь немного медленнее (о снижении быстродействия можно даже не говорить), при использовании нескольких массивов снижение скорости работы приложения вследствие того, что индексация элементов всех массивов начинается не с 0, может оказаться весьма существенной.

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

Так что же такого замечательного в использовании массивов в качестве структуры данных? Во-первых, вычисление адресов элементов выполняется очень быстро. Как уже говорилось, для этого нужно всего лишь умножение и сложение. При получении доступа к элементу N (MyArray [N]) компилятор для вычисления адреса добавляет простой машинный код. Независимо от значения числа N, формула для вычисления адреса будет одной и той же. Другими словами, получение доступа к элементу с индексом N принадлежит к классу операций O(1) и не зависит от величины N.

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

До сих пор мы рассматривали только преимущества массивов, но хотелось бы знать и об их недостатках. Первый недостаток связан с операциями вставки и удаления элементов. Что происходит, если, например, в массив необходимо вставить новый элемент с индексом n? В общем случае, все элементы с индексами, начиная с n и до конца массива, потребуется переместить на одну позицию, чтобы освободить место под новый элемент. А фактически выполняется следующий блок кода:

for i := LastElement downto N do

(Конечно, на практике цикл заменяется вызовом процедуры Move.)

Рисунок 2.1. Вставка в массив нового элемента

Рисунок 2.2. Удаление элемента из массива

Объем памяти, который будет затронут при вставке нового элемента, зависит от значения n и количества элементов в самом массиве. Чем больше количество элементов, которые необходимо переместить, тем больше времени потребуется на выполнение операции. То есть, время, требуемое на выполнение цикла For, будет пропорционально количеству элементов в массиве. Другими словами, вставка нового элемента в массив принадлежит к классу операций O(n).

Тот же ход рассуждений справедлив и для операции удаления элемента из массива. Но в этом случае удаление элемента с индексом n означает, что элементы, начиная с индекса n + 1 и до конца массива, будут перенесены на одну позицию к началу массива, чтобы «закрыть» образовавшуюся от удаления элемента «дыру». Как и в случае со вставкой, удаление принадлежит к классу операций O(n).

for i := N+ 1 to LastElementIndex do

(Конечно, на практике цикл заменяется вызовом процедуры Move.)

Таким образом, важно понимать, что операции вставки и удаления элемента при увеличении количества элементов в массиве будут выполняться медленнее, поскольку они принадлежат к классу операций O(n).

Кроме того, есть еще один вопрос, связанный со вставкой и удалением элементов, — необходимо контролировать количество активных элементов, т.е. в качестве последнего элемента массива нужно ввести сигнальный (sentinel) элемент, который будет использоваться в качестве метки конца массива. (В строках с завершающим нулем таким сигнальным элементом является символ #0.) Как правило, во время компиляции объявляются массивы фиксированного размера (сейчас мы говорим о методах увеличения размеров массивов), а, следовательно, для этого нам необходимо знать количество активных элементов. В двух приведенных выше примерах для хранения количества активных элементов использовалась переменная LastElementIndex. В строках и длинных строках, например, в самой строке, содержится счетчик количества символов. Но если мы не планируем использовать вставку или удаление элементов, никаких дополнительных элементов не требуется.

Стоит упомянуть и об еще одной проблеме, которая касается только программирования в Delphi1. В Delphi1 максимальный объем непрерывного выделяемого блока памяти (по крайней мере, без написания дополнительного кода на ассемблере) равен 64 Кб. Если объем одного элемента массива составляет 100 байт, то это означает, что в массиве не может быть больше 655 таких элементов. Не так уж и много. Это 64-Кбное ограничение может вызвать определенные проблемы и привести к тому, что придется использовать указатели на элементы (как, например, в знаменитом классе TList), а не сами элементы (в массиве TList в Delphi1 количество элементов ограничено числом 16 383).

Array — Ключевое слово Delphi

От Delphi 4 к Delphi 5 Трехмерные массивы.
Такие массивы могут быть представлены в виде трехмерного куба, имеющего ячейки одинакового типа и размера (рисунок 1).
Синтаксис объявления типов трехмерных массивов следующий:
type
ИмяТипаМассива = array [Определение индекса1, Определение индекса2, Определение индекса3] of Базовый тип;
Например:
TheTthreeDimensionalArray = array [1..3, 1..3, 1..3] of Real;
Array3D = array [1..4,Boolean, 1..50] of Byte;
Доступ к конкретному элементу массива возможен с использованием выражения:
ИмяМассива[Индекс1, Индекс2, Индекс3];
где Индекс1, Индекс2, Индекс3 — выражения, которые относятся к величинам соответствующего типа.
Например:
type
TheTthreeDimensionalArray = array [1..3, 1..3, 1..3] of Real;
procedure TForm1.Button1 Click(Sender: TObject);
var
AD: TheTthreeDimensionalArray;
R:Real;
begin
AD[1,1,1]:= 15;
AD[1,1,2]:= 28;
R:= AD[1,1,1] + AD[1,1,2];
Edit1.Text:= FloatToStr(R);
end;
end.

Многомерные массивы
В более редких ситуациях, когда требуется больше, чем три размерности, Object Pascal позволяет вам объявлять массивы любой размерности.
Синтаксис объявления типа многомерного массива следующий:
type
ИмяТипаМассива = array [ОпределениеИндекса1, ОпределениеИндекса2. ОпределениеИндексаN] of БазовыйТип;
например:
type
MonthlyAmounts = array [1..12,1..3,Boolean,-1..1] of Real;
TemperatureGr >Общее определение типа массива допускает любое число размерностей, обозначаемых произвольным выражением порядкового типа.
Object Pascal не накладывает ограничений на размерность массивов. Вы можете объявить столько размерностей, то есть, столько независимых индексов, сколько требуется. Существует, однако, ограничение на общий размер массива и на общий размер любой структуры данных, которая может быть определена.

Использование многомерных массивов
Отдельные элементы массива доступны через их индексы.
Ниже приведен синтаксис ссылки на конкретный элемент массива:
ИмяМассива[Индекс1, Индекс2, ИндексЗ. ИндексN]
Индекс1. ИндексN — в этом операторе произвольные выражения порядкового типа.
Доступ к отдельным элементам массива осуществляется путем указания имени массива и вслед за ним индекса (или списка индексов, разделенных запятыми, если у массива их несколько) в квадратных скобках. Вы можете, таким образом, получать значения отдельных элементов и заносить в указанные элементы новые значения.
Когда вы обращаетесь к элементам массива в своей программе, индексом массива может быть произвольное арифметическое выражение, результатом которого является целое число или выражение, которое можно привести к величине перечислимого типа, если эта величина совместима с указанным типом индекса и находится в указанных границах изменения индекса.
Объявление типа массива не создает действительного экземпляра массива. Вы уже знаете, что для резервирования места в памяти под переменную надо эту переменную определить. Указанное правило применимо и для массивов.
Элемент массива — это переменная, точно такая же, как и любая другая переменная базового типа массива. Просто вместо того, чтобы прямо ссылаться на переменную, указав ее название, в случае элемента массива приходится использовать имя массива и выражение для индекса в квадратных скобках, однозначно определяющее элемент в массиве. Различают статические и динамические массивы.

Статические массивы
Статические массивы предполагают определение его размеров в блоке type или var. Массивы, которые были рассмотрены ранее, относятся к статическим массивам.
Статические типы массива объявляются следующим образом:
array[indexType1. indexTypeN] of baseType
где каждый indexType — перечислимый тип, чей размер не превышает 2GB.
Самый простой случай — это одномерный массив, в нем имеется только единственный indexType.
Например:
var MyArray: array[1..100] of Char;
Объявляется переменная с именем MyArray, которая определена как массив из 100 символьных значений. Объявление вида MyArray [3] обозначает третий символ в массиве MyArray. Если вы создаете статический массив, но не назначаете значения для всех его элементов, то неиспользованные элементы распределены, но содержат случайные данные; они в этом случае подобны неинициализированным переменным.
Статический двумерный массив. Например,
type TMatrix = array[1..10] of array[1..50] of Real;
Является эквивалентным объявлению:
type TMatrix = array[1..10, 1..50] of Real;
Какой бы путь ни был для TMatrix объявлен, он представляет массив из 500 реальных значений. Переменная MyMatrix типа TMatrix может быть определена таким образом:
MyMatrix [2,45]; или: MyMatrix [2] [45].
Точно так же
packed array[Boolean,1..10, TShoeSize] of Integer;
Является эквивалентным следующему объявлению:
packed array[Boolean] of packed array[1..10] of packed array[TShoeSize] of Integer;
С целью экономии памяти, занимаемой массивами и другими структурными данными, вы можете предварять описание типа зарезервированным словом packed, например:
vаг A: packed array [I.. 10] of Byte;
Ключевое слово packed указывает компилятору, что элементы структурного типа должны храниться, т.е. располагаться плотно друг возле друга, даже если это замедляет к ним доступ. Если структурный тип данных описан без ключевого слова packed, компилятор выравнивает его элементы на 2-x и 4-байтовых границах, чтобы ускорить к ним доступ.
Ключевое слово packed применимо к любому структурному типу данных, т.е. к массиву, множеству, записи, файлу, классу, ссылке на класс.

Параметры в виде открытых массивов
Функции и процедуры в Object Pascal могут воспринимать в качестве параметров не только массивы фиксированного размера, но и так называемые открытые массивы, размер которых неизвестен. В этом случае в объявлении функции или процедуры они описываются как массивы базовых типов без указания их размерности. Например:
procedure SumArray(A:array of integer; var В: array of integer);
При таком определении передаваемый в функцию первый массив будет копироваться и с этой копией — массивом А, будет работать процедура. Второй открытый массив определен как var. Выбирая, как передавать открытый массив в функцию, надо учитывать, что если его размер очень велик, то при копировании будут большие затраты памяти и времени, а может произойти и аварийное завершение, если в стеке не хватит места.
Массив, переданный как открытый, воспринимается в теле процедуры или функции как массив с целыми индексами, начинающимися с 0. Размер массива может быть определен функциями Length — число элементов и High — наибольшее значение индекса. Очевидно, что всегда High = Length — 1.
В качестве примера рассмотрим процедуру, которая принимает два открытых одинакового размера массива целых чисел, суммирует их и заносит результат во второй из переданных массивов.
procedure SumArray(A:array of Integer; var В: array of Integer);
var
I:Word;
begin
for I:=0 to High(A) do B[I]:=A[I]+B[I];
end;
Вызов этой процедуры может иметь вид:
var
A1,A2: array [1..3] of Integer
begin
<операторы заполнения массивов>
SumArray(А1,А2);
end;
Обратите внимание на то, что массивы А и В, передаваемые в качестве аргументов, имеют значения индексов от 1 до 3, а процедура оперирует с индексами в диапазоне 0—2. Однако никакой путаницы не возникнет. Просто, например, элемент А[0] в теле процедуры будет соответствовать элементу А1[1] в массиве А1.
При вызове функции или процедуры с параметром в виде открытого массива можно использовать в качестве аргумента конструктор открытого массива, который формирует массив непосредственно в операторе вызова. Список элементов такого конструктора массива заключается в квадратные скобки, а значения элементов разделяются запятыми. Например, функцию Sum, суммирующую элементы числового массива, можно вызвать следующим образом:
S:= Sum([1.2,4.45,0.1]);

Динамические массивы
Среда Delphi 4 вводит концепцию динамических массивов.
Динамический массив не имеет установленного размера или длины. При этом память для динамического массива не распределяется при его объявлении.
В процессе разработки приложения вы можете установить массив с точно установленным размером, используя процедуру SetLength.
Например,
var MyFlexibleArray: array of Real;
Объявляется одномерный динамический массив вещественных чисел. Объявление не распределяет память для MyFlexibleArray.
Чтобы создавать массив в памяти, вызовите процедуру SetLength.
Например:
SetLength(MyFlexibleArray, 20);
Производится определение массива из 20 вещественных чисел, индексированного от 0 до 19. Динамические массивы, индексированные целым числом, всегда начинаются от 0 значения.
Используя динамические массивы, вы можете распределять памяти столько, сколько требуется в данное время. Вы можете перераспределять массив, используя функцию Copy.

Компонент StaticText
Отображение надписей на форме осуществляется с использованием компонента StaticText.
Для ввода текста применяется свойство Caption.
Цвет фона определяется свойством Color, а цвет надписи — свойством Color, являющегося комплексным свойством раздела Font. Если значение цвета специально не задавать, то цвет фона обычно сливается с цветом контейнера, содержащего компонент, так что фон просто не заметен.
Компонент StaticText имеет свойство BorderStyie, определяющее рамку текста или бордюр. На рисунке 2 вы можете видеть влияние бордюра на вид метки StaticText. При стиле sbsNone метка StaticText по виду не отличается от метки Label. Вероятно, если уж использовать бордюр, то наиболее приятный стиль sbsSunken.
Размещение компонента на форме определяется, в частности, свойствами Top, Left, Height, Width, Align, Anchors, Constraints. Они определяют координаты компонента, его размеры и их изменение при изменении пользователем размеров родительского компонента. При изменении пользователем размеров окна приложения надо перерисовывать компоненты, отображающие текст. Иначе выравнивание текста может нарушаться. Чтобы этого не было, надо в обработку события формы OnResize вставить операторы, перерисовывающие компоненты методом Repaint:
StaticTextl.Repaint;
Размер компонента StaticText определяется также свойством AutoSize. Если оно установлено в True, то вертикальный и горизонтальный размеры компонента определяются размером надписи. Если же AutoSize равно False, то выравнивание текста внутри компонента определяется свойством Alignment, которое позволяет выравнивать текст по левому краю, правому краю или центру клиентской области.
В компоненте StaticText перенос длинного текста осуществляется автоматически, если значение AutoSize установлено в False и размер компонента достаточен для размещения нескольких строк. Для того чтобы в StaticText осуществлялся перенос при изменении пользователем размеров окна, надо осуществлять описанную выше перерисовку компонента методом Repaint в обработчике события формы ОnResize.
Можно отметить еще одно свойство StaticText, превращающее его в некоторое подобие управляющих элементов. Это свойство FocusControl, фокусируемый компонент. Если в свойстве Caption поместить перед одним из символов символ амперсант «&», то символ, перед которым поставлен амперсант, отображается в надписи метки подчеркнутым (сам амперсант вообще не отображается). Если после этого обратиться к свойству метки FocusControl, то из выпадающего списка можно выбрать элемент, на который будет переключаться фокус, если пользователь нажмет клавиши быстрого доступа: клавишу Alt + подчеркнутый символ.
Для того чтобы клавиши быстрого доступа в компоненте работали, необходимо установить свойство ShowAccelChar в True.
Рассмотрим пример использования компонента StaticText. Главный смысл этого примера состоит в том, что вы вводите числовые значения в текстовые редакторы. Эти числа вы можете суммировать, умножать, делить, вычитать. Причем немного необычным способом. Например, чтобы провести умножение чисел, вы должны стать курсором на область формы, занимаемую компонентом StaticText2, нажать левую кнопку мыши и, не отпуская ее, перевести на компонент Edit4 справа от компонента Label 4 «Умножение». В результате в окне текстового редактора появится результат умножения двух чисел, причем атрибуты StaticText2 (шрифт, цвет) будут атрибутами компонента Edit2. В этом примере используется технология Drag & Drop.
1. Запустите Delphi.
2. Сохраните файл модуля под именем Account_.pas, файл проекта под именем Account.dpr.
3. Поместите на форму компонент StaticText1 со страницы Additional. В инспекторе объекта установите свойство Align равное alTop, свойство Alignment равное taCenter. Используя свойство Caption, запишите заголовок «StaticText1 Деление». Установите свойство Font по вашему желанию. Свойство Color установите равным clBtnHighlight.
4. Поместите на форму компонент StaticText2 со страницы Additional. В инспекторе объекта установите свойство Align равное alLeft, свойство Alignment равное taCenter. Используя свойство Caption, запишите заголовок «StaticText2 Умножение». Установите свойство Font по вашему желанию. Свойство Color установите равным clYellow.
5. Поместите на форму компонент StaticText3 со страницы Additional. В инспекторе объекта установите свойство Align равное alRight, свойство Alignment равное taCenter. Используя свойство Caption, запишите заголовок «StaticText3 Сумма». Установите свойство Font по вашему желанию. Свойство Color установите равным clLime.
6. Поместите на форму компонент StaticText4 со страницы Additional. В инспекторе объекта установите свойство Align равное alBottom, свойство Alignment равное taCenter. Используя свойство Caption, запишите заголовок «StaticText4 Разность». Установите свойство Font по вашему желанию. Свойство Color установите равным clInfoBk.
7. Поместите на форму шесть компонентов Edit, которые вы будете использовать следующим образом: для ввода первого числа, ввода второго числа, отображение результата умножения, деления, суммы и разности.
8. Поместите на форму шесть компонентов Label, для них введите соответствующие заголовки: «Первое число», «Второе число», «Деление», «Умножение», «Сумма», «Разность».
9. Для всех компонентов Edit и Static Text установите свойство DragMode равное dmAutomatic.
10. Для компонентов Edit3, Edit4, Edit5, Edit6, используя события DragOver и DragDrop, напишите программный код, показанный ниже.
implementation
<$R *.DFM>
var
A,B,C:Real;
procedure TForm1.Edit3Drag-Over(Sender, Source: TObject; X, Y: Integer;
State: TDragState; var Accept: Boolean);
begin
Accept:= Source is TStaticText;
end;
procedure TForm1.Edit3DragDrop(Sender, Source: TObject; X, Y: Integer);
begin
if (Sender is TEdit) and (Source is TStaticText) then
begin
with Sender as TEdit do
begin
Font:= (Source as TStaticText).Font;
Color:= (Source as TStaticText).Color;
A:=StrToFloat(Edit1.Text);
B:=StrToint(Edit2.Text);
C:=A/B;
Edit3.Text:=FloatToStr(C);
end;
end;
end;
procedure TForm1.Edit4Drag-Over(Sender, Source: TObject; X, Y: Integer;
State: TDragState; var Accept: Boolean);
begin
Accept:= Source is TStaticText;
end;
procedure TForm1.Edit4DragDrop(Sender, Source: TObject; X, Y: Integer);
begin
if (Sender is TEdit) and (Source is TStaticText) then
begin
with Sender as TEdit do
begin
Font:= (Source as TStaticText).Font;
Color:= (Source as TStaticText).Color;
A:=StrToFloat(Edit1.Text);
B:=StrToint(Edit2.Text);
C:=A*B;
Edit4.Text:=FloatToStr(C);
end;
end;
end;
procedure TForm1.Edit5Drag-Over(Sender, Source: TObject; X, Y: Integer;
State: TDragState; var Accept: Boolean);
begin
Accept:= Source is TStaticText;
end;
procedure TForm1.Edit5DragDrop(Sender, Source: TObject; X, Y: Integer);
begin
if (Sender is TEdit) and (Source is TStaticText) then
begin
with Sender as TEdit do
begin
Font:= (Source as TStaticText).Font;
Color:= (Source as TStaticText).Color;
A:=StrToFloat(Edit1.Text);
B:=StrToint(Edit2.Text);
C:=A+B;
Edit5.Text:=FloatToStr(C);
end;
end;
end;
procedure TForm1.Edit6Drag-Over(Sender, Source: TObject; X, Y: Integer;
State: TDragState; var Accept: Boolean);
begin
Accept:= Source is TStaticText;
end;
procedure TForm1.Edit6DragDrop(Sender, Source: TObject; X, Y: Integer);
begin
if (Sender is TEdit) and (Source is TStaticText) then
begin
with Sender as TEdit do
begin
Font:= (Source as TStaticText).Font;
Color:= (Source as TStaticText).Color;
A:=StrToFloat(Edit1.Text);
B:=StrToint(Edit2.Text);
C:=A-B;
Edit6.Text:=FloatToStr(C);
end;
end;
end;
end.
Результат работы программы показан на рисунке 3.
Вы можете в программе применить цикл for для уменьшения программного кода. В таком виде программа позволяет выполнять технологию Drag & Drop с любого компонента StaticText, причем вычисления производятся правильные, только поддерживаются атрибуты избранного компонента. Чтобы увидеть это, выберите курсором, например, компонент StaticText4, нажмите левую кнопку мыши и, не отпуская ее, протяните на компонент Edit4. Выполнится операция умножения, и атрибуты этого компонента будут соответствовать компоненту StaticText4.

Литература:
1. Марко Канту. Delphi 2 для Windows 95/NT. Москва. ООО «Малип». 1997 г.
2. Джон Матчо. Дэвид Р. Фолкнер. Delphi. Москва. БИНОМ. 1995 г.
3. Эндрю Возневич. Delphi. Освой самостоятельно. Москва. Восточная книжная компания. 1996 г.
4. К. Сурков, Д. Сурков, А. Вальвачев. Программирование в среде Delphi 2.0. Издательство «Попурри». Минск 1997 г.
5. В.В.Фаронов. Delphi 5. Учебный курс. Москва. Издательство Нолидж. 2000 г.
6. А. Я. Архангельский. Программирование в Delphi 5. Москва. ЗАО Издательство «Бином». 2000 г.

Илон Маск рекомендует:  Атрибут style в HTML
Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL