
- •1 Компоненты Delphi
- •1.1 Компонент класса TGroupBox
- •1.2 Компонент класса TRadioButton
- •1.3 Компонент класса TRadioGroup
- •1.4 Компонент класса TCheckBox
- •1.5 Компонент класса TListBox
- •1.6 Компонент класса TForm
- •1.7 Компонент класса TImage
- •1.8 Компонент класса TTimer
- •1.9 Компонент класса TImageList
- •1.10 Компоненты классов TActionList и TAction
- •1.11 Компонент класса TMainMenu
- •1.12 Компоненты классов TToolBar и TToolButton
- •1.13 Компоненты класса TStatusBar и TStatusPanel
- •1.14 Компоненты классов TOpenDialog и TSaveDialog
- •1.15 Компонент класса TTreeView
- •2 Примеры выполнения практических заданий
- •2.1 Стандартные алгоритмы
- •2.2 Элементы выбора
- •2.3 Простейшие классы
- •2.4 Графика
- •2.5 Диалоговые окна
- •2.6 Комплексное задание
- •2.7 Наследование
- •2.8 Древовидные структуры

2 Примеры выполнения практических заданий
2.1 Стандартные алгоритмы
Задание: Дана целочисленная квадратная матрица А. Получить массив B, i-ый элемент которого содержит среднее значение элементов i-ой строки матрицы A. Отсортировать массив B по возрастанию1.
Будем считать, что начальное и минимально число строк и столбцов матрицы равно двум, а максимальное – 10.
Для решения поставленной задачи потребуются компоненты:
Count_SE класса TSpinEdit для задания размерности матрицы А;
Matr_SG класса TStringGrid для ввода матрицы A;
Mas_SG класса TStringGrid для вывода массива В;
Count_L класса TLabel для подписи компонента Count_SE;
Matr_L класса TLabel для подписи компонента Matr_SG;
Mas_L класса TLabel для подписи компонента Mas_SG;
Calc_B класса TButton для активизации расчета.
Установим следующие значения свойств компонентов (таблица 1):
Таблица 1 – Значения свойств компонентов для примера выполнения задания по реализации стандартных алгоритмов
Компонент.Свойство |
Значение |
Count_L.Caption |
Ра&змер исходной матрицы |
Count_L.FocusControl |
Count_SE |
Count_SE.MinValue |
2 |
|
|
Count_SE.MaxValue |
10 |
|
|
Count_SE.Value |
2 |
Matr_L.Caption |
Исходная матри&ца |
Matr_L.FocusControl |
Matr_SG |
Matr_SG.RowCount |
2 |
Matr_SG.ColCount |
2 |
Matr_SG.FixedCols |
0 |
|
|
Matr_SG.FixedRows |
0 |
|
|
Matr_SG.Options.goEditing |
True |
Matr_SG.Options.goAlwaysShowEditor |
True |
Mas_L.Caption |
Полученный ма&ссив |
Mas_L.FocusControl |
Mas_SG |
Mas_SG.RowCount |
1 |
|
|
Mas_SG.ColCount |
2 |
|
|
Mas_SG.FixedCols |
0 |
1 Требования к заданиям по используемым компонентам не приводятся
15

Продолжение таблицы 1
Компонент.Свойство |
Значение |
Mas_SG.FixedRows |
0 |
Calc_B.Caption |
Рас&чет |
Опишем событие OnChange компонента Count_SE:
procedure TForm1.Count_SEChange(Sender: TObject); begin
Matr_SG.RowCount := Count_SE.Value;
Matr_SG.ColCount := Count_SE.Value;
{Размерность матрицы и размер массива одинаковые} Mas_SG.ColCount := Count_SE.Value;
end;
Опишем событие OnClick кнопки Calc_B1:
procedure TForm1.Calc_BClick(Sender: TObject); var
matr : array of array of integer; mas : array of double;
i,j : integer; temp : double;
begin
{Перед использованием динамических массивов им необходимо
выделить память} SetLength(matr,Count_SE.Value,Count_SE.Value); SetLength(mas,Count_SE.Value);
{Заполнение матрицы}
for i := 0 to Count_SE.Value-1 do for j := 0 to Count_SE.Value-1 do
matr[i,j] := StrToInt(Matr_SG.Cells[j,i]); {Перебор строк матрицы}
for i := 0 to Count_SE.Value-1 do begin
{Для каждой строки находится сумма ее элементов} mas[i] := 0;
for j := 0 to Count_SE.Value-1 do mas[i] := mas[i]+matr[i,j];
{Для нахождения среднего сумма элементов строки делится на их количество}
mas[i] := mas[i]/Count_SE.Value; end;
{Сортировка массива} i := 0;
while i<Count_SE.Value-1 do if mas[i]>mas[i+1] then
1 Реализации алгоритмов, приводимые в примерах, не всегда оптимальны, так как направлены на раскрытие механизмов работы с компонентами.
16

begin
temp := mas[i]; mas[i] := mas[i+1]; mas[i+1] := temp; if i>0 then
dec(i) else
inc(i);
end else
inc(i); {Вывод массива}
for i := 0 to Count_SE.Value-1 do Mas_SG.Cells[i,0] := FloatToStr(mas[i]);
{Перед завершением программы необходимо очистить память,
занимаемую динамическими массивами} SetLength(matr,0,0); SetLength(mas,0);
end;
Внешний вид1 и пример работы программы показаны на рисунке 2.
Рисунок 2 – Внешний вид и пример работы программы, реализующей стандартные алгоритмы
2.2 Элементы выбора
Задание: Дана целочисленная квадратная матрица A размером n. Получить матрицу B путем замены кратных двум, трем, четырем элементов матрицы A в любой комбинации на количество положительных, отрицательных или нулевых элементов матрицы A.
1 Здесь и далее для получения внешнего вида, показанного на рисунках, необходима настройка еще ряда свойств компонентов, изучение которых не предусматривается в рамках данных занятий.
17

Будем считать, что начальное и минимально число строк и столбцов матриц равно двум, а максимальное – 10.
Для решения поставленной задачи потребуются компоненты:
Count_SE класса TSpinEdit для задания размерности матриц;
MatrA_SG класса TStringGrid для ввода матрицы A;
MatrB_SG класса TStringGrid для вывода матрицы B;
Change_GB класса TGroupBox для группировки компонентов выбора
заменяемых элементов;
Div2_CB класса TCheckBox для организации выбора необходимости замены элементов, кратных двум;
Div3_CB класса TCheckBox для организации выбора необходимости замены элементов, кратных трем;
Div4_CB класса TCheckBox для организации выбора необходимости замены элементов, кратных четырем;
Count_RG класса TRadioGroup для указания типа подсчета количества элементов;
Count_L класса TLabel для подписи компонента Count_SE;
MatrA_L класса TLabel для подписи компонента MatrA_SG;
MatrB_L класса TLabel для подписи компонента MatrB_SG;
Calc_B класса TButton для активизации расчета.
Установим следующие значения свойств компонентов (таблица 2):
Таблица 2 – Значения свойств компонентов для примера выполнения задания с использованием компонентов выбора
Компонент.Свойство |
Значение |
Count_L.Caption |
Ра&змер исходной матрицы |
Count_L.FocusControl |
Count_SE |
|
|
Count_SE.MinValue |
2 |
|
|
Count_SE.MaxValue |
10 |
Count_SE.Value |
2 |
MatrA_L.Caption |
Исходная &матрица |
MatrA_L.FocusControl |
MatrA_SG |
MatrA_SG.RowCount |
2 |
MatrA_SG.ColCount |
2 |
|
|
MatrA_SG.FixedCols |
0 |
|
|
MatrA_SG.FixedRows |
0 |
MatrA_SG.Options.goEditing |
True |
MatrA_SG.Options.goAlwaysShowEditor |
True |
MatrB_L.Caption |
П&олученная матрица |
MatrB_L.FocusControl |
MatrB_SG |
|
|
MatrB_SG.RowCount |
2 |
|
|
MatrB_SG.ColCount |
2 |
MatrB_SG.FixedCols |
0 |
18
Продолжение таблицы 2
Компонент.Свойство |
Значение |
MatrB_SG.FixedRows |
0 |
Change_GB.Caption |
Замена элементов |
Div2_CB.Caption |
кратных &двум |
Div3_CB.Caption |
кратных &трем |
Div4_CB.Caption |
кратных &четырем |
Count_RG.Caption |
На количество элементов |
Count_RG.Items |
поло&жительных |
|
отри&цательных |
|
н&улевых |
Count_RG.ItemIndex |
0 |
|
|
Calc_B.Caption |
Расч&ет |
Опишем событие OnChange компонента Count_SE:
procedure TForm1.Count_SEChange(Sender: TObject); begin
{Размер матриц одинаков, поэтому установка количества строк и столбцов осуществляется у обеих матриц} MatrA_SG.RowCount := Count_SE.Value;
MatrA_SG.ColCount := Count_SE.Value;
MatrB_SG.RowCount := Count_SE.Value;
MatrB_SG.ColCount := Count_SE.Value; end;
Опишем событие OnClick кнопки Calc_B:
procedure TForm1.Calc_BClick(Sender: TObject); var
matr : array of array of integer; i,j,count : integer;
begin
{Перед использованием динамического массива ему необходимо выделить память} SetLength(matr,Count_SE.Value,Count_SE.Value); {Заполнение матрицы}
for i := 0 to Count_SE.Value-1 do for j := 0 to Count_SE.Value-1 do
matr[i,j] := StrToInt(MatrA_SG.Cells[j,i]); {Подсчет количества указанных пользователем элементов} count := 0;
for i := 0 to Count_SE.Value-1 do for j := 0 to Count_SE.Value-1 do
{Элемент требует учета, если:
"он положительный и пользователь выбрал учет
положительных элементов или он отрицательный и пользователь выбрал учет отрицательных элементов или
19