Замечания и комментарии к программному коду




Проект «ALGOR»

Сегодня нам предстоит сделать один проект в системе Lazarus, который будет решать сразу три задачи. Вычислять:

1. Факториал натурального числа.

2. Число Фибоначчи по его номеру.

3. Наибольший общий делитель двух натуральных чисел.

Первый шаг – это разработка сценария.

Разрабатываем сценарий

Пусть при запуске форма выглядит следующим образом.

На ней три кнопки с названиями задач, кнопка для счета и кнопка очистки. Никаких полей ввода пока нет, так как мы еще не выбрали конкретную задачу для счета.

Если пользователь решил посчитать факториал, то он щелкает мышкой по первой кнопке и на форме появляется окно ввода с подсказкой. Пользователь вводит исходные данные, нажимает на кнопку СЧЕТ и видит результат.

Если пользователь решил найти число Фибоначчи или наибольший общий делитель, то сначала ему необходимо убрать с формы все лишнее и вернуть форму в начальное состояние. Для этого нужно нажать на кнопку очистки.

Практическая реализация сценария

«Собираем» форму

Кладем на форму пять кнопок (TButton), два окна ввода (TEdit) и три надписи (TLabel). В соответствии с правилами оформления кода даем им правильные программные имена (свойство name) и делаем на них необходимые надписи (свойства caption и text). Поля ввода и все надписи делаем невидимыми (свойство visible).


Необходимая информация к написанию программного кода

1. Свойство tag

Свойство tag есть у всех компонент и специально создано для удобства разработчиков. Свойство tag имеет тип Longint. Можно сказать, что tag является аналогом глобальной переменной. В нашем случае tag изначально будет равен нулю. Зададим это значение через инспектор в объектов. Затем его можно менять программно.

Например, btnCount.tag:= k свойству tag кнопки с именем btnCount присвоили значение переменной k.

2. Что такое sender?

Sender имеет тип Tobject. Sender и меет значение того объекта, который является источником события. Например, мы кликнули мышкойна кнопку btnFr, значит в данном случае, sender - это btnFr.

3. Если кнопок несколько, например, 3. то используем sender as Tbutton и не нужно создавать три процедуры нажатия

При этом можно использовать все свойства Tbutton.
Например, s:= (sender as Tbutton).caption

 

· Если мы нажали на кнопку,

 

то переменной s будет присвоено значение 1. Факториал

· Если мы нажали на кнопку,

 

то переменной s будет присвоено значение 2. Число Фибоначчи

Тип переменной s - string. Например, можно узнать первую цифру на кнопке и присвоить эту цифру свойству tag кнопки btnCount.

k:= StrToInt(copy(s,1,1));

btnCount.tag:= k;

4. Если написана процедура нажатия на одну кнопку (в нашей программе это кнопка btnFactor), то написанную процедуру можно назначить двум другим кнопкам с помощью инспектора объектов (раздел события).

 

Пишем программный код

Кнопка очистки

По клику на Кнопку очистки окна ввода и надписи должны стать невидимыми.

 

procedure TfrmAlgor.btnClearClick(Sender: TObject);

Begin

edtN.visible:= FALSE;

edtM.visible:= FALSE;

lblN.visible:= FALSE;

lblM.visible:= FALSE;

lblRez.visible:= FALSE;

end;


Кнопка btnFactor

procedure TfrmAlgor.btnFactorClick(Sender: TObject);

Var

s, s0: string;

k: integer;

Begin

s:= (sender as Tbutton).caption;

s0:= copy(s,1,1);

k:= StrToInt(s0);

btnCount.tag:= k;

Case k of

1, 2: begin

lblN.visible:= TRUE;

edtN.visible:= TRUE;

end;

3: begin

lblN.visible:= TRUE;

edtN.visible:= TRUE;

lblM.visible:= TRUE;

edtM.visible:= TRUE;

end;

end; { case }

end;

Кнопка счета

procedure TfrmAlgor.btnCountClick(Sender: TObject);

 

function factor(p: longint): longint;

Var

f, i: longint;

Begin

f:= 1;

for i:= 1 to p do

f:= f * i;

factor:= f;

end;

 

function fib(p: longint): longint;

//var

Begin

fib:= 2;

end;

 

function nod(p, q: longint): longint;

//var

Begin

nod:= 3;

end;

 

Var

k, rez, n, m: longint;

 

Begin

lblRez.visible:= TRUE;

k:= btnCount.tag;

Case k of

1: begin

n:= StrToInt(edtN.text);

rez:= factor(n);

lblRez.caption:= edtN.text + '! = ' + IntToStr(rez);

end;

2: begin

//n:= StrToInt(edtN.text);

rez:= fib(n);

lblRez.caption:= IntToStr(rez);

end;

3: begin

//n:= StrToInt(edtN.text);

//m:= StrToInt(edtM.text);

rez:= nod(n, m);

lblRez.caption:= IntToStr(rez);

end;

end; { case }

 

end;

 

Замечания и комментарии к программному коду

 

1. Переменной k присвоим значение свойства tag кнопки счета. В нашем случае tag изначально был равен нулю, а при выборе одной из первых трех кнопок (конкретной задачи для расчета) получил значение номера кнопки: 1, 2 или 3.

2. Оператор case. Он может заменить множественные if-ы. В операторе case переменная k (эту переменную еще называют селектором выбора) уже имеет какое-то значение и, в зависимости от этого значения, управление передается одному из блоков. В нашем случае, если селектор равен единице, то вычисляется факториал; если двойке, то число Фибоначчи и т.д. Обратите внимание на такую особенность: у оператора есть end, но нет begin. Селектором выбора может быть переменная типа integer, boolean, char,
тип-диапазон и никогда – строки.

3. Функции fib и nod вам придется писать самим. Пока результатом их работы является номер соответствующей кнопки.

Подведем итоги

1. Прежде, чем писать код, нужно четко продумать сценарий.

2. При написании кода неукоснительно следовать правилам его оформления – это значительно облегчает дальнейшую работу.

3. Отлаживать программу частями. Для этого некоторые подпрограммы можно или совсем не писать в начале, или делать «пустыми» (у нас это fib и nod). «Пустые» подпрограммы иначе называют заглушками.

4. Узнали нового:

· Свойство tag – глобальная переменная целого типа.

· Оператор case – заменяет множественные условные операторы.

· Понятие sender – позволяет заменить множество процедур одной.



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2020-10-21 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: