- DelphiComponent.ru — бесплатно видеоуроки по Delphi, статьи, исходники
- Массивы в Delphi
- ЗАКАЗАТЬ
- Объявление массива
- Вывод массива
- Ввод массива
- Использование компонента StringGrid
- Работа с массивами в Delphi
- Ввод массива
- Поиск минимального (максимального) элемента массива
- Поиск заданного элемента в массиве
- Сортировка массива
DelphiComponent.ru — бесплатно видеоуроки по Delphi, статьи, исходники
Массивы в Delphi
Массив— это структура данных, представляющая собой набор переменных одинакового типа, имеющих общее имя. Массивы удобно использовать для хранения однородной по своей природе информации, например, таблиц и списков.
Хочешь 106 видеоуроков по Delphi в которых я разжевал подробнейшим образом все тонкости программирования на этом языке?
Тогда тебе нужно кликнуть сюда:
ЗАКАЗАТЬ
Объявление массива
Массив, как и любая переменная программы, перед использованием должен быть объявлен в разделе объявления переменных. В общем виде инструкция объявления массива выгладит следующим образом:
- имя — имя массива;
- array — зарезервированное слово языка Delphi, обозначающее, что объявляемое имя является именем массива;
- нижний_индекс и верхний_индекс — целые константы, определяющие диапазон изменения индекса элементов массива и, неявно, количество элементов (размер) массива;
- тип — тип элементов массива.
Примеры объявления массивов:
temper:array[ 1..31 ] of real ;
koef: array [ 0..2 ] of integer ;
name: array [ 1..30 ] of string [ 25 ];
Специально по теме массивов, чтобы было Вам понятнее я подготовил отдельный видеоурок. Посмотрите его обязательно и сразу поймете как работать с массивами!
При объявлении массива удобно использовать именованные константы. Именованная константа объявляется в разделе объявления констант, который обычно располагают перед разделом объявления переменных. Начинается раздел объявления констант словом const. В инструкции объявления именованной константы указывают имя константы и ее значение, которое отделяется от имени символом «равно». Например, чтобы объявить именованную константу нв, значение которой равно 10, в раздел const надо записать инструкцию: нв=ю. После объявления именованной константы ее можно использовать в программе как обычную числовую или символьную константу. Ниже в качестве примера приведено объявление массива названий команд-участниц чемпионата по футболу, в котором используются именованные константы.
Для того чтобы в программе использовать элемент массива, надо указать имя массива и номер элемента (индекс), заключив индекс в квадратные скобки. В качестве индекса можно использовать константу или выражение целого типа, например:
team[ 1 ] := ‘Зенит 1 ;
d := koef[l]*koef[l]- 4 *koef[ 2 ]*koef[ 1 ];
ShowMessage(name[n+ 1 ]);
temper := StrToFloat(Editl . text);
Если массив не является локальным, т. е. объявлен не в процедуре обработки события, а в разделе переменных модуля, то одновременно с объявлением массива можно выполнить его инициализацию, т. е. присвоить начальные значения элементам массива. Инструкция объявления массива с одновременной его инициализацией в обшем виде выглядит так:
Имя: array [нижний_индекс. .верхний_индекс] of тип = (список) ;
где список — разделенные запятыми значения элементов массива.
a: array[lO] 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 (локальная переменная не может быть инициализирована). Локальный массив можно инициализировать только во время работы программы, например, так:
for i := 1 to 10 do a:= 0 ;
Типичными операциями при работе с массивами являются:
- вывод массива;
- ввод массива;
- поиск максимального или минимального элемента массива;
- поиск заданного элемента массива;
- сортировка массива.
Вывод массива
Под выводом массива понимается вывод на экран монитора (в диалоговое окно) значений элементов массива.
Если в программе необходимо вывести значения всех элементов массива, то для этого удобно использовать инструкцию for, при этом переменная счетчик инструкции for может быть использована в качестве индекса элемента массива.
В качестве примера на рис. 5.1 приведено диалоговое окно приложения, которое демонстрирует инициализацию и процесс вывода значений элементов массива в поле метки. Программа выводит пронумерованный список футбольных команд. Следует обратить внимание, что для того чтобы список команд выглядел действительно как список, свойству Label1.AutoSize нужно присвоить значение False (присвойте свойству Label1.Autosize значение True и посмотрите, как будет работать программа). Текст программы приведен в листинге.
Листинг. Инициализация и вывод массива
02. interface
03. Windows, Messages, SysOtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
04. type
05. TForml = class (TForm)
06. Buttonl: TButton;
07. Label1: TLabel;
08. procedure ButtonlClick(Sender: TObject);
09. private
10. < Private declarations >
11. public
12.
13. end ;
14. var
15. Form1: TForm1;
16. implementation
17. <$R *,dfm>
18. const
19. NT = 5 ;
20. var
21. team: array [ 1.. NT] of string [ 10 ] =( ‘Зенит1,’ Динамо 1 , ‘Ротор1,’ Спартак ‘,’ СКА’) ;
22. procedure TForml . ButtonlClick(Sender: TObject);
23. var
24. st: string ; // список команд
25. i: integer ; // индекс, номер элемента массива
26. begin
27. // формирование списка для отображения в форме
28. for i:=l to NT do st := st + IntToStr(i)+ ‘ ‘ + team +# 13 ;
29. // вывод списка
30. Label1 . Caption := st;
31. end ;
32. end .
Ввод массива
Под вводом массива понимается процесс получения от пользователя (или изфайла) во время работы программы значений элементов массива,»Лобовое» решение задачи ввода элементов массива — для каждого элемента массива создать поле ввода. Однако если требуется ввести достаточно большой массив, то такое решение неприемлемо. Представьте форму, например,с десятью полями редактирования! Очевидно, что последовательность чисел удобно вводить в строку таблицы,где каждое число находится в отдельной ячейке. Ниже рассматриваются два варианта организации ввода массива с использованием компонентов StringGrid И Memo.
Использование компонента StringGrid
Для ввода массива удобно использовать компонент StringGrid. Значок компонента StringGrid находится на вкладке Additional (рис. 5.2).
Компонент strinqGrid представляет собой таблицу, ячейки которой содержат строки символов.
В качестве примера использования компонента stringGrid для ввода массива рассмотрим программу, которая вычисляет среднее арифметическое значение элементов массива. Диалоговое окно программы приведено на рис. 5.3. Компонент stringGrid используется для ввода массива, компоненты Label1 и Label2 — для вывода пояснительного текста и результата расчета, Buttoni — для запуска процесса расчета.
Добавляется компонент stringGrid в форму точно так же, как и другие компоненты. После добавления компонента к форме нужно выполнить его настройку в соответствии с табл. 5.2. Значения свойств Height и width следует при помощи мыши установить такими, чтобы размер компонента был равен размеру строки.
Текст программы приведен в листинге.
Значения свойств компонента StringGrid1
Свойство | Значение |
ColCount | 5 |
FixedCols | 0 |
RowCount | 1 |
DefaultRowHeight | 24 |
Height | 24 |
DefaultColWidth | 64 |
Width | 328 |
Options.goEditing | true |
Options.AlwaysShowEditing | true |
Options.goTabs | true |
Листинг. Ввод и обработка массива целых чисел
01. unit getar_;
02. interface
03. uses
04. Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls,
05. Forms, Dialogs, Grids, StdCtrls;
06. type
07. TForml = class (TForm]
08. Labell: TLabel;
09. StringGridl; TStringGrid;
10. Buttonl: TButton;
11. Label2: TLabel;
12. procedure ButtorilClicMSender: TObject];
13. private
14.
15. public
16. < Public declarations >
17. end ;
18. var
19. Forml: TForml;
20. implementation
21.
22. procedure TForml . ButtonlClick(Sender: TObject);
23. var
24. a : array [ 1..5 ] of integer ; // массив
25. suntrn: integer ; // сумма элементов
26. sr: real ; // среднее арифметическое
27. i: integer / // индекс
28. begin
29. // ввод массива
30. // считаем, что если ячейка пустая, то соответствующий
31. // ей элемент массива равен нулю
32. for i:= 1 to 5 do
33. if Length(StringGridl . Cells[i-l, 0 ]] 0
34. then a := StrToInt(StringGridl . Cells[i- 1 , 0 ))
35. else a := 0 ;
36. // обработка массива
37. summ := 0 ;
38. for i := 1 to 5 do
39. summ := summ + a;
40. sr : = summ / 5 ;
41. // вывод результата
42. Label2 . Caption := ‘Сумма элементов: ‘ + IntToStr(summl + # 13 + ‘Среднее арифметическое: ‘ + FloatToStr(sr);
43. end ; end .
После пробных запусков программы возникает желание внести изменения в процесс ввода массива. Так, было бы неплохо, чтобы курсор автоматически переходил в следующую ячейку таблицы, например, в результате нажатия клавиши . Сделать это можно при помощи процедуры обработки события onkeypress. На эту же процедуру можно возложить задачу фильтрации вводимых в ячейку таблицы данных. В нашем случае надо разрешить ввод в ячейку только цифр.
Текст процедуры обработки события onkeypress приведен в листинге 5.3. Следует обратить внимание на свойство Col, которое во время работы программы содержит номер колонки таблицы, в которой находится курсор. Это свойство можно также использовать для перемещения курсора в нужную ячейку таблицы. Однако нужно учитывать, что колонки таблицы, впрочем, как и строки, нумеруются с нуля.
Листинг 5.3. Процедура обработки события onkeypress
procedure TForml . StringGridlKeyPress(Sender: TObject; var Key; Char);
begin
case Key of
# 8 , ‘ 0 ‘ . . ‘9’ : ; // цифры и клавиша
# 13 : // клавиша
if StringGridl . Col . ColCount — 1
then StringGridl . Col := StringGridl . Col + 1 ;
else key := Chr(O); // остальные символы запрещены
end ;
end ;
Листинг 5.4. Ввод и обработка массива дробных чисел
Источник
Работа с массивами в Delphi
Очень был удивлен когда к нам поступила просьба рассказать о массивах и о их сортировке в Delphi. Но раз уж поступила просьба, а сайт наш призван помочь в освоении Delphi, то я решил написать эту статью, в которой расскажу Вам о возможных действиях с массивами в Delphi. При этом мы напишем несколько пользовательских функций, которые будут помогать нам в дальнейшем при работе с массивами.
Ввод массива
Для того чтобы работать с массивом, его надо с начала получить от пользователя. Попробуем осуществить ввод одномерного массива всего в одно поле редактирования. Каждый элемент массива будет отделяться от предыдущего разделителем. После щелчка на кнопке программа выделит из строки, содержащей массив, первую подстроку, затем выделит вторую подстроку и т.д.
Давайте сейчас этим и займемся. Поставьте на Вашу форму кнопку Button и поле редактирования Edit.
Заголовок нашей функции будет такой:
st — строка, содержащая массив expl — строка разделитель n — номер подстроки
Для получения n-ой подстроки (элемента массива) из полученной в качестве аргумента строки функция сначала удаляет предшествующую ей n-1 подстроку (цикл for), затем находит разделитель, который обозначает конец нужной подстроки, выделяет подстроку и возвращает ее в качестве значения функции (через свое имя).
Не забудьте добавить заголовок нашей функции в раздел Public модуля программы.
Теперь для проверки работы нашей функции напишем обработчик события OnClick, для нашей кнопки. В начале мы с помощью нашей функции получим массив из Edit1, а потом выведем его:
Поиск минимального (максимального) элемента массива
Будем искать минимальный элемент в целочисленном массиве. Для этого немного изменим обработчик события OnClick для кнопки:
В этом примере a[min] минимальный элемент массива, а min — номер минимального элемента. Алгоритм очень простой: сравниваем каждый следующий элемент с минимальным, если он меньше минимального, то запоминаем его номер в переменной min, и продолжаем сравнивать уже с ним.
Чтобы найти максимальный элемент, нужно изменить всего одну строку:
Надо заменить на:
Только теперь a[min] — максимальный элемент, а min — номер максимального элемента.
Поиск заданного элемента в массиве
Поступим методом простого перебора. Для этого будем перебирать все элементы массива, пока не встретим искомый элемент, или пока не дойдем до конца массива.
Элемент, совпадение с которым нам надо найти будем хранить в текстовом поле Edit2. Обработчик события OnClick нашей кнопки будет иметь такой вид:
Сортировка массива
Вот мы и дошли до самого интересного — до сортировки массива. Рассмотрим алгоритм т.н. прямого выбора. Смысл его заключается в следующем:
Просматривая массив от первого элемента, найдем минимальный элемент и поместим его на место первого элемента, а первый элемент — на место минимального.
Затем будем просматривать массив, начиная со второго элемента, и далее поступим, как поступили перед этим шагом.
Алгоритм ясен, теперь приступим к написанию кода. Все тот же обработчик события OnClick принимает теперь такой вид:
Ну вот мы и познакомились с самыми типичными действиями с массивами. Надеюсь эта статья оказалась Вам хоть немного полезной 🙂
Источник