- •Введение
- •1 Компоненты Delphi
- •1.1 Компонент класса TEdit
- •1.2 Компонент класса TLabel
- •1.3 Компонент класса TButton
- •1.4 Компонент класса TMemo
- •1.5 Компонент класса TStringGrid
- •1.6 Компонент класса TSpinEdit
- •2 Примеры выполнения практических заданий
- •2.1 Простейшие алгоритмы
- •2.2 Выражения
- •2.3 Циклы
- •2.4 Одномерные массивы
- •2.5 Матрицы
- •2.6 Строки
- •2.7 Записи и файлы
- •2.8 Функции и процедуры
текущего найденного человека} min_index := 0;
{Перебор всех людей} for i := 1 to count do
{Проверка, соответствует ли год рождения i-го человека заданному условию}
if peoples[i].BirthYear>Year_SE.Value then
{Проверка, были ли ранее найден подходящий человек} if min_index=0 then
{Ранее не был найден подходящий человек. Запоминаем его номер}
min_index := i
else // Ранее был найден подходящий человек
{Проверка, имеет ли вновь найденный человек большее количество детей, чем найденный ранее}
if peoples[min_index].CountChild< peoples[i].CountChild then
min_index := i; // Запоминание номера человека {Проверка, найден ли подходящий человек}
if min_index>0 then
begin // Подходящий человек найден {Вывод данных о найденном человеке}
Find_SG.Cells[0,1] := peoples[min_index].LastName; Find_SG.Cells[1,1] :=
IntToStr(peoples[min_index].BirthYear); Find_SG.Cells[2,1] :=
IntToStr(peoples[min_index].CountChild);
end else
begin // Подходящий человек не найден
{Вывод сообщения, что никто не найден, и очистка
оставшихся ячеек} Find_SG.Cells[0,1] := 'Не найден'; Find_SG.Cells[1,1] := ''; Find_SG.Cells[2,1] := '';
end;
end;
Внешний вид и пример работы программы показаны на рисунке 7.
2.8 Функции и процедуры
Задание: Даны две целочисленные квадратные матрицы А и В произвольных размерностей. Определить, в какой из матриц сумма элементов главной диагонали наибольшая. При реализации программы использовать функцию или процедуру.
Будем считать, что начальное и минимальное число строк и столбцов матриц равно двум, а максимальное – 10.
26
Рисунок 7 – Внешний вид и пример работы программы, реализующей работу с записями и файлами
Для решения поставленной задачи потребуются компоненты:
CountA_SE класса TSpinEdit для задания размерности матрицы А;
MatrA_SG класса TStringGrid для ввода матрицы А;
CountB_SE класса TSpinEdit для задания размерности матрицы В;
MatrB_SG класса TStringGrid для ввода матрицы В;
Result_E класса TEdit для вывода результата;
CountA_L класса TLabel для подписи компонента CountA_SE;
MatrA_L класса TLabel для подписи компонента MatrA_SG;
CountB_L класса TLabel для подписи компонента CountB_SE;
MatrB_L класса TLabel для подписи компонента MatrB_SG;
Result_L класса TLabel для подписи компонента Result_E;
Calc_B класса TButton для активизации расчета.
Установим следующие значения свойств компонентов (таблица 11):
Таблица 11 – Значения свойств компонентов для примера выполнения задания по работе с функциями или процедурами
Компонент.Свойство |
|
Значение |
CountA_L.Caption |
|
Размерность матрицы &А |
CountA_L.FocusControl |
|
CountA_SE |
CountA_SE.MinValue |
|
2 |
|
|
|
CountA_SE.MaxValue |
|
10 |
|
|
|
CountA_SE.Value |
|
2 |
MatrA_L.Caption |
|
М&атрица А |
MatrA_L.FocusControl |
|
MatrA_SG |
MatrA_SG.RowCount |
|
2 |
|
27 |
|
Продолжение таблицы 11
Компонент.Свойство |
Значение |
MatrA_SG.ColCount |
2 |
MatrA_SG.FixedCols |
0 |
MatrA_SG.FixedRows |
0 |
|
|
MatrA_SG.Options.goEditing |
True |
|
|
MatrA_SG.Options.goAlwaysShowEditor |
True |
CountB_L.Caption |
Размерность матрицы &В |
CountB_L.FocusControl |
CountB_SE |
CountB_SE.MinValue |
2 |
CountB_SE.MaxValue |
10 |
|
|
CountB_SE.Value |
2 |
|
|
MatrB_L.Caption |
Ма&трица В |
MatrB_L.FocusControl |
MatrB_SG |
|
|
MatrB_SG.RowCount |
2 |
MatrB_SG.ColCount |
2 |
MatrB_SG.FixedCols |
0 |
|
|
MatrB_SG.FixedRows |
0 |
|
|
MatrB_SG.Options.goEditing |
True |
|
|
MatrB_SG.Options.goAlwaysShowEditor |
True |
Result_L.Caption |
Р&езультат |
Result_L.FocusControl |
Result_E |
Calc_B.Caption |
Рас&чет |
Очистим свойство «Text» у компонента Result_E. Опишем событие OnChange компонента CountA_SE:
procedure TForm1.CountA_SEChange(Sender: TObject); begin
{Т.к. матрица квадратная, то одновременно надо изменять и количество строк, и количество столбцов} MatrA_SG.RowCount := CountA_SE.Value; MatrA_SG.ColCount := CountA_SE.Value;
end;
Опишем событие OnChange компонента CountB_SE:
procedure TForm1.CountB_SEChange(Sender: TObject); begin
MatrB_SG.RowCount := CountB_SE.Value;
MatrB_SG.ColCount := CountB_SE.Value; end;
Опишем тип данных для хранения данных матрицы. Тип данных может быть описан в разделе type секции implementation.
TMatr = array[1..10,1..10] of integer;
28
Опишем функцию подсчета суммы диагональных элементов матрицы, которая в качестве параметров будет принимать саму матрицу и ее текущий размер. Функция может быть описана в секции implementation после описания типа данных.
function SumDiag(Matr : TMatr; n : integer) : integer; var
i : integer; begin
Result := 0;
for i := 1 to n do
Result := Result+Matr[i,i];
end;
Опишем событие OnClick кнопки Calc_B:
procedure TForm1.Calc_BClick(Sender: TObject); var
MatrA,MatrB : TMatr; i,j,SumA,SumB : integer;
begin
{Заполнение матрицы A}
for i := 1 to CountA_SE.Value do for j := 1 to CountA_SE.Value do
MatrA[i,j] := StrToInt(MatrA_SG.Cells[i-1,j-1]); {Заполнение матрицы B}
for i := 1 to CountB_SE.Value do for j := 1 to CountB_SE.Value do
MatrB[i,j] := StrToInt(MatrB_SG.Cells[i-1,j-1]); {Расчет суммы для матрицы A}
SumA := SumDiag(MatrA,CountA_SE.Value); {Расчет суммы для матрицы B}
SumB := SumDiag(MatrB,CountB_SE.Value); {Сравнение сумм и вывод результата}
if SumA>SumB then Result_E.Text :=
'Сумма элементов главной диагонали больше у матрицы А'
else
if SumA<SumB then Result_E.Text :=
'Сумма элементов главной диагонали больше у матрицы B' else
Result_E.Text :=
'Суммы элементов главной диагонали матриц А и В равны';
end;
Внешний вид и пример работы программы показаны на рисунке 8.
29
Рисунок 8 – Внешний вид и пример работы программы, использующей функции или процедуры
30