Для решения вычислительных задач используются следующие математические знаки операций:
'+' - знак сложения;
'-' - знак вычитания;
'/' - знак деления;
'*' - знак умножения;
Для логических операций предусмотрены следующие знаки:
Логическая запись
|
Описание
|
X < Y |
Значение X меньше Y |
X > Y |
Значение X больше Y |
X <= Y |
Значение X меньше либо равно Y |
X >= Y |
Значение X больше либо равно Y |
X <> Y |
Значение X не равно Y |
(x=a) or (y=c) |
(x=a) или (y=c) |
(x=a) and (y=c) |
(x=a) и (y=c) |
В стандартной поставке Delphi и Lazarus есть встроенные математические функции унаследованные из языка Паскаль:
Функция Pascal
|
Математическая функция
|
sqr(x) |
Квадрат числа х |
sqrt(x) |
Квадратный корень из числа х |
abs(x) |
Модуль числа х |
trunc(x) |
Целая часть числа х |
frac(x) |
Дробная часть числа х |
x div y |
Целочисленное деление x на y. Дробная часть числа отбрасывается. Например: 25 div 10 = 2 |
x mod y |
Получение дробной части при делении х на y. Например: 25 mod 10 = 5 |
exp(x) |
Число е (2,718282) в степени х |
ln(x) |
Логарифм натуральный числа х |
round(x) |
Округление числа х до ближайшего целого |
inc(x,y) |
Инкремент - увеличение х на величину у. Если у не указано, то х увеличивается на 1 |
dec(x,y) |
Декремент - уменьшение х на величину у. Если у не указано, то х уменьшается на 1 |
randomize |
Включение генератора случайных чисел |
random(a) |
Получение случайного числа в диапазоне от 0 до а (а - целое число) |
sin(x) |
Синус аргумента х (аргумент в радианах) |
cos(x) |
Косинус аргумента х (аргумент в радианах) |
arcTan(X) |
Арктангенс аргумента х (аргумент в радианах) |

Функции модуля Math
В списке встроенных функций явно не хватает таких функций как: возведение числа в произвольную степень; извлечение произвольного корня из числа; обратные тригонометрические функции и так далее.
Для расширения математических возможностей программ есть подключаемый модуль Math. Перед началом работы следует подключить этот модуль в разделе Uses.
Модуль Math содержит следующие математические функции:
Функция
|
Описание
|
ArcSin(X) |
арксинус аргумента X (-1 : 1) (Возвращает значение в радианах) |
ArcCos(X) |
арккосинус аргумента X (-1 : 1) (Возвращает значение в радианах) |
Tan(X) |
тангенс аргумента (угол X в радианах) |
Cotan(X) |
котангенс угла (угол X в радианах) |
Log10(X) |
вычисление десятичного логарифма |
Log2(X) |
вычисление двоичного логарифма числа X |
LogN(y,x) |
вычисление логарифма числа x по основанию y |
Max(a,b) |
возвращает максимальное число из двух чисел |
Min(a,b) |
возвращает минимальное число из двух чисел |
Power (X, N) |
возведение числа X в произвольную степень N |
Hypot(X,Y) |
вычисление гипотенузы по длине катетов |
RadToDeg(X) |
Преобразование радиан в градусы |
DegToRad(X) |
Преобразование градусов в радианы |
Floor |
Округление в меньшую сторону |
Ceil |
Округление в большую сторону |
Имея такой богатый набор функций можно создать серьёзный инженерный калькулятор.

Интерфейс инженерного калькулятора
Разработаем калькулятор в среде разработки Lazarus (В среде Delphi интерфейс и коды программы будут аналогичными).
Сначала расставим элементы интерфейса, так как показано на рисунке:
В заголовке окна (Caption) следует написать "Инженерный калькулятор" и для окна настроить шрифт (Font), так что бы он хорошо отображался и на дочерних объектах. Например: Arial, 12 pt, Bold (жирный).
Заголовкам объектов следует присвоить надписи, как показано на рисунке:
Рассмотрим функциональное назначение элементов интерфейса:
Label1 (?) - будет отображать знак операции или название функции;
Label2 (z) - будет отображать результат вычислений;
Edit1, Edit2 - предназначены для ввода аргументов вычислений;
Button1 (=) - вычисление;
Button2 (+) - ввод знака сложения;
Button3 (-) - ввод знака вычитания;
Button4 (/) - ввод знака деления;
Button5 (*) - ввод знака умножения;
Button6 (Sin) - ввод функции Sin;
Button7 (Cos) - ввод функции Cos;
Button8 (Power) - ввод функции возведения числа x в степень n;
Button7 (Sq) - ввод функции извлечения корня n из числа x;
В объектном паскале аргумент тригонометрических функций принято задавать в радианах. Для переключения между градусами и радианами поставим на форме группирующую панель (GroupBox1) и переключатели (RadioButton1, RadioButton2):
Для RadioButton1 в свойстве Checked следует установить значение True. Затем, у GroupBox1 удалить заголовок Caption, а у объектов RadioButton1и RadioButton2 сделать заголовки как показано на рисунке:
Для работы с калькулятором потребуется ещё одна кнопка "Сброс" (Button10), которая будет очищать поля ввода. Поставим её в любом удобном месте, например как показано на рисунке:

Реализация калькулятора
Сначала следует подключить в разделе uses модуль Math:
uses
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls, Math;
Для идентификации нажатых кнопок арифметических знаков и функций нужна будет индексная переменная, назовём её, например Ind и поместим в разделе глобальных переменных:
var
Form1: TForm1;
Ind: Integer;
Начнём программирование с создания события (двойным щелчком) для кнопки "Сброс":
//Кнопка сброс
procedure TForm1.Button10Click(Sender: TObject);
begin
Ind:= 0;
Label1.caption:= '';
Label2.caption:= '';
Edit1.Clear;
Edit1.SetFocus;
Edit2.Clear;
Edit2.Enabled:= false;
end;
В этой процедуре мы написали Edit2.Enabled:= false; - заблокировали редактор Edit2. Это нужно для того, чтобы пользователь не мог ввести туда данные, если вычисляет функции с одним аргументом. При арифметических вычислениях и функциях с двумя аргументами мы будем разблокировать этот редактор.
Запустим программу на исполнение (F9), нажмём кнопку "Сброс" и убедимся, что все поля очищаются.
Закроем программу и сделаем ещё дополнительные настройки для кнопок. Для этого выделим, например кнопку "Sq(xn)" и в свойствах в поле ShowHint поставим значение True. Затем, в поле Hint (подсказка) напишем: Корень n из числа x.
Запустим программу и убедимся что на этой кнопке появляется подсказка при наведении курсора мыши.
Аналогичным образом следует сделать подсказки на остальные кнопки. Мы видим, что подсказка появляется и буквально через секунду исчезает. Для удобного пользования подсказками увеличим выдержку подсказки, например до 5 секунд. Для этого, выделим окно форму и двойным щелчком создадим событие FormCreate:
//Создание формы
procedure TForm1.FormCreate(Sender: TObject);
begin
Application.HintHidePause := 5000;
end;
В строке Application.HintHidePause := 5000 мы задаём время выдержки до закрытия подсказки 5 секунд (аргумент 5000 в миллисекундах).
Произведя все предварительные настройки, будем создавать код калькулятора. Выделим кнопку "+" (Button2) и двойным щелчком создадим событие:
// Кнопка +
rocedure TForm1.Button2Click(Sender: TObject);
begin
Label1.Caption:= '+';
Ind:= 1; //Индекс этой кнопки равен 1
Edit2.Enabled:= true; //Разблокируем редактор для ввода 2-го аргумента
end;
Аналогичным способом создадим события для кнопок - / * присваивая переменной Ind соответствующие значения - 2, 3, 4.
//Кнопка -
procedure TForm1.Button3Click(Sender: TObject);
begin
Label1.Caption:= '-';
Ind:= 2; //Индекс этой кнопки равен 2
Edit2.Enabled:= true;
end;
//Кнопка /
procedure TForm1.Button4Click(Sender: TObject);
begin
Label1.Caption:= '/';
Ind:= 3; //Индекс этой кнопки равен 3
Edit2.Enabled:= true;
end;
//Кнопка *
procedure TForm1.Button5Click(Sender: TObject);
begin
Label1.Caption:= '*';
Ind:= 4; //Индекс этой кнопки равен 4
Edit2.Enabled:= true;
end;
Далее, создадим событие на вычисление результата математических операций. Сначала напишем код для вычисления арифметических операций, проверим работоспособность программы, а затем, допишем строки для вычисления различных функций. Двойным щелчком на Button1 создадим событие и впишем строки:
procedure TForm1.Button1Click(Sender: TObject);
//Объявляем локальные переменные
var
x,y,z: real;
begin
//Проверяем ввод первого аргумента и преобразуем текст в число
if Edit1.Text <> '' then x:= StrToFloat(Edit1.Text) else exit;
// Проверяем ввод второго аргумента и преобразуем текст в число
if Edit2.enabled = true then
begin
if Edit2.Text <> '' then y:= StrToFloat(Edit2.Text) else exit;
end;
//Выбираем по индексу знак операции и производим вычисления
case Ind of
1: z:= x + y;
2: z:= x - y;
3: z:= x / y;
4: z:= x * y;
end;
//Выводим результат на Label2
Label2.Caption:= FloatToStr(z);
end;
Проверим, как работает программа, пока только арифметических вычислений:
Далее, будем создавать события на вычисление тригонометрических и математических функций.
Создадим двойным щелчком событие для кнопки вычисления синуса (Sin, Button6):
// Sin
procedure TForm1.Button6Click(Sender: TObject);
begin
Label1.Caption:= 'Sin';
Ind:= 5; //Индекс этой кнопки равен 5
Edit2.Enabled:= false; //Делаем недоступным ввод второго аргумента
end;
И допишем в процедуре вычисления, в разделе case (выделено жирным) строки вычисления синуса:
procedure TForm1.Button1Click(Sender: TObject);
var
x,y,z: real;
begin
if Edit1.Text <> '' then x:= StrToFloat(Edit1.Text) else exit;
if Edit2.enabled = true then
begin
if Edit2.Text <> '' then y:= StrToFloat(Edit2.Text) else exit;
end;
z:= 0;
case Ind of
1: z:= x + y;
2: z:= x - y;
3: z:= x / y;
4: z:= x * y;
5: begin
//Проверяем вводимый аргумент градусы или радианы
if RadioButton1.checked = true then x:= DegToRad(x);
z:= sin(x);
end;
end;
Label2.Caption:= FloatToStr(z);
end;
Запустим программу и убедимся, что синус вычисляется корректно:
Такую же процедуру создадим для кнопки косинус (Cos, Button7):
//Cos
procedure TForm1.Button7Click(Sender: TObject);
begin
Label1.Caption:= 'Cos';
Ind:= 6; //Индекс этой кнопки равен 6
Edit2.Enabled:= false;
end;
В процедуру вычисления (=), в разделе case добавим строки:
6: begin
if RadioButton1.checked = true then x:= DegToRad(x);
z:= cos(x);
end;
И так, мы сделали вычисление функций с одним аргументом. Далее, разработаем алгоритм вычисления для функций с двумя аргументами. Выделим кнопку возведения в степень (Power, Button8) и двойным щелчком создадим событие:
// Power
procedure TForm1.Button8Click(Sender: TObject);
begin
Label1.Caption:= 'Power';
Ind:= 7; //Индекс этой кнопки равен 7
Edit2.Enabled:= true; //Включаем второй редактор
end;
Дописываем в процедуре (=) в разделе Case следующую строку:
7: z:= power(x,y);
Запускаем калькулятор, и убеждаемся, что возведение в степень работает исправно:
Аналогичным образом напишем процедуру для кнопки извлечения корня (Sq, Button9):
// Sq(x,n)
procedure TForm1.Button9Click(Sender: TObject);
begin
Label1.Caption:= 'Sq';
Ind:= 8; //Индекс этой кнопки равен 8
Edit2.Enabled:= true; //Включаем второй редактор
end;
И дописываем в раздел Case процедуры (=) следующую строку:
8: z:= power(x,1/y);
Запускаем калькулятор, и убеждаемся, что извлечение корня работает исправно:
Для расширения возможностей калькулятора следует установить дополнительные кнопки для вычисления различных функций и создать соответствующие процедуры, способами, рассмотренными в этом разделе.
|