Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
методички по информатике / Программирование в среде Delphi (Часть 1).pdf
Скачиваний:
50
Добавлен:
27.05.2015
Размер:
1.11 Mб
Скачать

текущего найденного человека} 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