Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Программирование в Delphi (повторение).doc
Скачиваний:
7
Добавлен:
04.05.2019
Размер:
2.74 Mб
Скачать

5.8.2. Операции с массивами

Типичными операциями при работе с массивами являются:

• ввод массива;

• вывод массива;

• поиск максимального или минимального элемента массива;

• поиск заданного элемента массива;

• сортировка массива.

Для ввода массива удобно использовать компонент StringGrid (рис. 5.22). Значок компонента StringGrid находится на вкладке Additional.

Рис. 5.22. Компонент StringGrid на форме

Компонент StringGrid представляет собой таблицу, ячейки которой содер­жат строки символов. В табл. 5.14. перечислены некоторые свойства компо­нента StringGrid.

Таблица 5.14

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

Свойство

Определяет

Name

Имя компонента. Используется в программе для доступа к свойствам компонента

ColCount

Количество колонок таблицы

RowCount

Количество строк таблицы

Cells

Соответствует двумерному массиву. Ячейка

таблицы, находящаяся на пересечении столбца номер col и строки номер row. Определяется элементом cells[col,row]

Продолжение табл. 5.14

FixedCols

Количество зафиксированных слева колонок таблицы

Зафиксированные колонки выделяются цветом и при го­ризонтальной прокрутке таблицы остаются на месте

FixedRows

Количество зафиксированных сверху строк таблицы. За-

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

Options.goEditing

Признак допустимости редактирования содержимого ячеек таблицы. True – редактирование разрешено False – запрещено

Options.goTab

Разрешает (True) или запрещает (False) использование

клавиши <Таb> для перемещения курсора в следующую ячейку таблицы

Defaultcolwidth

Ширину колонок таблицы

DefaultRowHeight

Высоту строк таблицы

GridLineWidth

Ширину линий, ограничивающих ячейки таблицы

Left

Расстояние от левой границы поля таблицы до левой

границы формы

Тор

Расстояние от верхней границы поля таблицы до верхней границы формы

Height

Высоту поля таблицы

width

Ширину поля таблицы

Font

Шрифт, используемый для отображения содержимого ячеек таблицы

Parent Font

Признак наследования характеристик шрифта формы

Нумерация колонок и строк таблицы начинается с нуля.

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

Компонент StringGrid используется для ввода массива, компо­ненты Label1 и Label2 – для вывода пояснительного текста и результата расчета, Button1 – для запуска процесса расчета.

Рис. 5.23. Диалоговое окно программы

Добавляется компонент StringGrid в форму точно так же, как и другие компоненты. После добавления компонента к форме нужно выполнить его настройку в соответствии с табл. 5.15. Значения свойств Height и Width следует при помощи мыши установить такими, чтобы размер компонента был равен размеру строки [3].

Таблица 5.15

Значения свойств компонента StringGrid1

Свойство

Значение

ColCount

5 (количество колонок)

FixedCols

0 (количество зафиксированных слева колонок)

RowCount

1 (количество строк таблицы)

DefaultRowHeight

24 (высота строк таблицы)

Height

24 (высота поля таблицы)

DefaultColWidth

64 (ширина колонок таблицы)

Width

328 (ширина поля таблицы)

Options.goEditing

True (редактирование)

Options.goTabs

True (клавиша Tab)

Процедура обработки события KeyPress допускает ввод в ячейку только цифры и по нажатию клавиши <Enter> курсор автоматически переходит в следующую ячейку таблицы. Вычисление суммы и среднего арифметического производится с помощью процедуры Button1Click.

procedure TForm1.Button1Click(Sender: TObject);

var

a: array[1..5] of integer;

summ, i: integer;

sr:real;

begin

for i:= 1 to 5 do

// длина содержимого ячейки на пересечении столбца (i-1) и //строки 0

if Length(StringGrid1.Cells[i-1,0])<> 0

then a[i]:= StrToInt(StringGrid1.Cells[i-1,0])

else a[i]:= 0;

summ:=0;

for I := 1 to 5 do

summ:=summ + a[i];

sr:= summ/5;

Label2.Caption:=

'Сумма элементов: ' + IntToStr(summ)+#13+

'Среднее арифметическое: ' +FloatToStr(sr);

end;

procedure TForm1.StrnigGrid1KeyPress(Sender: TObject; var Key: Char);

begin

case Key of

#8,'0'..'9':;

#13: //переход в следующую колонку по клавише #13, если

//номер колонки не превышает общее количество

if StringGrid1.Col < StringGrid1.ColCount - 1

then StringGrid1.Col:= StringGrid1.Col + 1;

else Key:= Chr(0);

end;

end;

Другой вариант процедуры TForm1.StrnigGrid1KeyPress в случае, если для компонента StrnigGrid1 в Инспекторе Объектов было установлено свойство

Options.goTabs:= true. Тогда процедура может быть записана так:

procedure TForm1.StrnigGrid1KeyPress(Sender: TObject; var Key: Char);

begin

case Key of

#8,'0'..'9':;

#13: Button1.SetFocus

else Key:= Chr(0);

end;

end;

Очень часто требуется инициализировать массив до выполнения приложения. Как указывалось ранее, в этом случае массив объявляется в разделе переменных модуля и одновременно можно выполнить его инициализацию. Для отражения начальных значений элементов массива в компоненте StringGrid используется процедура

FormCreate, которая «подключается» на вкладке events (события) для компонента Form. Фрагмент программы глобального объявления, инициализации и использования FormCreate:.

procedure StrnigGrid1KeyPress(Sender:TObject; var Key: Char);

procedure Button1Click(Sender: TObject);

procedure FormCreate(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

Form1: TForm1;

a: array[1..5] of integer=(1,2,3,4,5);

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);

var

//a: array[1..5] of integer;

summ, i: integer;

sr:real;

begin

for i:= 1 to 5 do

if Length(StringGrid1.Cells[i-1,0])<> 0

then a[i]:= StrToInt(StringGrid1.Cells[i-1,0])

else a[i]:= 0;

summ:=0;

for I := 1 to 5 do

summ:=summ + a[i];

sr:= summ/5;

Label2.Caption:=

'Сумма элементов: ' + IntToStr(summ)+#13+

'Среднее арифметическое: ' +FloatToStr(sr);

end;

procedure TForm1.formcreate(Sender: TObject);

var

i: integer;

begin

for i := 1 to 5 do

StringGrid1.Cells[i-1,0]:=IntToStr(a[i]);

end;

procedure TForm1.StrnigGrid1KeyPress(Sender: TObject; var Key: Char);

begin

case Key of

#8,'0'..'9':;

#13: Button1.SetFocus

else Key:= Chr(0);

end;

end;

end.

Если нужно ввести массив дробных чисел (a: array [1. .5] of real), то процедура обработки события OnKeyPress несколько усложнится, т. к. кроме цифр допустимыми символами являются символ-разделитель (запятая и. точка – зависит от настройки Windows) и минус. Для использования допустимого символа-разделителя можно применить обращение к глобальной переменной DecimalSeparator.

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

procedure TForm1.Button1Click(Sender: TObject);

var

a: array[1..5] of real; // массив

summ: real; // сумма элементов

sr: real; // среднее арифметическое

i: integer; // индекс

begin

// ввод массива

// считаем, что если ячейка пустая, то соответствующий

// ей элемент массива равен нулю

for i:= 1 to 5 do

if Length(StringGrid1.Cells[i-1,0]) <> 0

then a[i] := StrToFloat(StringGrid1.Cells[i-1,0])

else a[i] := 0;

// обработка массива

summ := 0;

for i :=1 to 5 do

summ := summ + a[i];

sr := summ / 5;

// вывод результата

Label2.Caption :=

'Сумма элементов: ' + FloatToStr(summ) + #13+

'Среднее арифметическое: ' + FloatToStr(sr);

end;

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

procedure TForm1.StrnigGrid1KeyPress(Sender: TObject; var Key: Char);

begin

case Key of

#8,'0'..'9':; // Back Space и цифры

'.',',': // разделитель целой и дробной части числа

begin

if Key <> DecimalSeparator

then Key:= DecimalSeparator; //замена разделителя

//на допустимый

if Pos(DecimalSeparator,

StringGrid1.Cells[StringGrid1.Col,0])<>0

then Key:= Chr(0);

end;

'-': //минус можно ввести только первым символом

if Length(StringGrid1.Cells[StringGrid1.Col,0])<>0

then Key:= chr(0)

else //остальные символы запрещены

Key:= Chr(0);

#13: Button1.SetFocus;

end;

end;

end.