Для решения вычислительных задач используются следующие математические знаки операций:
"+" - знак сложения;
"-" - знак вычитания;
"/" - знак деления;
"*" - знак умножения;
Для логических операций предусмотрены следующие знаки:

В стандартной поставке 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 создадим событие и впишем строки:


//Объявляем локальные переменные
var
x,y,z: real;
begin
//Проверяем ввод первого аргумента и преобразуем текст в число

// Проверяем ввод второго аргумента и преобразуем текст в число

begin

end;
//Выбираем по индексу знак операции и производим вычисления
case Ind of
1: z:= x + y;
2: z:= x - y;
3: z:= x / y;
4: z:= x * y;
end;
//Выводим результат на Label2

end;

Проверим, как работает программа, пока только арифметических вычислений:

// 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
//Проверяем вводимый аргумент градусы или радианы

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);
Запускаем калькулятор, и убеждаемся, что извлечение корня работает исправно:

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

Что такое процедура? Это маленькая программа, выполняющая операции с указанными данными. Различают собственно процедуры и функции. Их основное отличие - процедура просто совершает какие-либо операции, а функция обязательно выдаёт какой-либо результат в результате своей работы. Существует огромное количество стандартных процедур и функций. Подпрограммы (так называют процедуры и функции) можно писать и самостоятельно, но об этом речь пойдёт позже. Сейчас нам нужно научиться работать с готовыми функциями.

Общие сведения о подпрограммах

Фактически, подпрограмма - это такая же полноценная программа, просто работает она не отдельно, не сама по себе, а включена в другую программу.
У подпрограммы всегда есть имя. Имя строится по тем же правилам, что и идентифмкатор. Как правило, имена даются вполне логичные. Например, если функция находит максимальное из нескольких чисел, то её логично назвать Max .
Подпрограммы могут иметь входные параметры. Входные параметры - это данные, которые сообщаются подпрограмме до начала её работы, а в процессе выполнения эти данные могут использоваться. Тем не менее, подпрограммы могут и не иметь входных параметров. Входные параметры также называют аргументами. Например, функции, которая узнаёт текущее время, никакие дополнительные параметры не нужны, а вот если функция считает факториал, то обязательно должно быть число, для которого он считается.
Как было сказано выше, функция выдаёт какое-то значение в результате своей работы. Процедура в общем случае значения не выдаёт.

Вызов подпрограмм

Вызываются подпрограммы по имени. Если подпрограмме требуется передать какие-либо параметры, то они указываются в скобках после имени подпрограммы через запятую. Если входные параметры отсутствуют, достаточно просто написать имя подпрограммы, либо оставить скобки пустыми. В случае, если работа происходит с функцией, результат можно "сохранить" в какой-то переменной, просто "присвоив" этой переменной функцию.

Обратите внимание: работа с функциями происходит как с обычными переменными, просто их значения вычисляются "на лету".

Функции математических вычислений

Эти функции работают с числовыми данными. Как правило, входным параметром является какое-то число, а выходным - результат вычисления. Практически везде аргумент является либо целым числом (Integer ), либо вещественным (Real ). Возвращаемое значение - тоже число. Рассмотрим некоторые из этих функций:

Abs(x) - модуль (абсолютное значение) указанного числа x . Пример: Abs(-5) = 5 .

Sin(x) - синус числа x . Здесь x - угол в радианах (не в градусах!). Пример: Sin(Pi/2) = 1 .

Cos(x) - косинус числа x . Аналогично, x - радианы. Пример: Cos(Pi) = -1 .

Exp(x) - экспонента, e x (e в степени x ).

Ln(x) - натуральный логарифм числа x . Пример: Ln(Exp(2)) = 2 .

Sqr(x) - квадрат числа x (x 2 ). Пример: Sqr(5) = 25 .

Sqrt(x) - квадратный корень числа x . Пример: Sqrt(64) = 8 .

Int(x) - целая часть числа x . Пример: Int(1.234) = 1 .

Frac(x) - дробная часть числа x . Пример: Frac(1.234) = 0.234 .

Round(x) - округление аргумента до ближайшего целого числа. Пример: Round(1.234) = 1 .

Trunc(x) - целая часть вещественного числа x. Пример: Trunc(1.234) = 1 .

Pred(x) - предыдущее значение x (например, для x = 2 это 1 ).

Succ(x) - следующее значение x (для x = 2 это 3 ).

Odd(x) - проверка аргумента на нечётность. Функция возвращает значение True , если аргумент является нечётным числом и False - если чётным. Пример: Odd(5) = True .

Предсказываю вопрос: в чём отличие Int() от Trunc() ? А отличие в том, что Int() возвращает число вещественного типа, а Trunc() - целочисленного .

Это лишь часть всех доступных функций. На самом деле их гораздо больше. Но помимо функций есть ещё процедуры.

Процедуры работы с числами

Поскольку процедуры в результате работы не выдают никакого значения, процедуры работы с числами просто изменяют переданные им параметры-переменные.

Inc(x) - увеличение аргумента на единицу. Фактически, это то же самое, что x:=x+1 . Тем не менее, рекомендуется использовать именно эту функцию, так как работает она быстрее.
Примечание: под понятием "быстрее" подразумевается, конечно, быстрота "компьютерная". Компьютер выполняет миллионы операций в секунду и для человека такие вещи незаметны.

Inc(x,n) - увеличение аргумента на число n . Эквивалентно записи x:=x+n .

На самом деле, это не две разные процедуры - просто параметр n является необязательным. Да, бывают необязательные параметры, которые можно указать, а можно и не указывать. Если они отсутствуют, то просто берётся какое-то значение по умолчанию. В данном случае n по умолчанию имеет значение 1 .

Dec(x,n) - уменьшение аргумента на n единиц. Точно также, как и в Inc , параметр n является необязательным. Эквивалентно записи x:=x-n .

В документации необязательные параметры обычно заключают в квадратные скобки, т.е. обычно пишут Inc(x , [n]) . Обратите внимание: это лишь условное обозначение, которое создано с целью узнавания, что параметр необязательный. В программном коде никаких скобок нет и быть не может.

Не хватает стандартных математических функций?

Существует дополнительный модуль с именем Math , в котором содержится большое число математических функций. Например, если нужно посчитать гиперболический арксеканс числа, то мучаться и описывать способ его вычисления вручную не придётся - есть готовая функция ArcSecH() .
Чтобы подключить модуль Math , откройте исходный код модуля. Для этого, когда открыта форма, следует нажать F12 , либо выбрать пункт меню View " Toggle Form/Unit . Далее нужно переместиться в самое начала модуля в раздел uses . В этом разделе через запятую описываются имена подключённых модулей. Как можно заметить, даже при наличии пустой формы несколько модулей уже подключены. В этот список и следует добавить Math :

Всё, теперь в Вашем распоряжении большое количество математических функций.

Пример комбинирования функций

Раз уж речь пошла о математических функциях, пусть пример будет на них и основан. Допустим, у нас есть такая сравнительно сложная функция:

Нам нужно создать программу, которая бы вычисляла значение этой функции по заданным числам x и y . Рассмотрим поэтапно элементы функции:
1) Возведение числа e в степень, модуль - функции Exp() и Abs() соответственно.
2) Натуральный логарифм - функция Ln() .
3) Число e ... Часто спрашивают - как получить число e ? Ведь это, по сути, такая же константа, как и число пи ... Но она не объявлена... А ответ прост: e = e 1 , поэтому e - это exp(1) .
4) Тангенс - функция Tan() .
Всё необходимое у нас есть, поэтому можно приступить к записи. Главное - не забывать заключать в скобки отдельные элементы формулы, чтобы порядок действий сохранился (в нашем примере это не потребуется).

var f,x,y: Real;

f:= Exp(Abs(x-y))+Ln(1+Exp(1))*Tan(Pi-7);

Как возвести число в степень?

Почему я останавливаюсь на таких вопросах? Просто они очень часто возникают у новичков и не каждый может догадаться, как выполнить требуемую операцию.

Способ 1. X y можно преобразовать к виду e ln(x)⋅y . Тогда возведение в степень можно записать так:

:= Exp(y * Ln(x));

Способ 2. В модуле Math есть функция для возведения в степень - Power . У функции 2 аргумента - основание и показатель степени. Запись, соответственно, следующая :=Power(x,y);

Случайные числа

Зачем нужны случайные числа? Как правило, чтобы проверить результаты какого-то эксперимента при различных условиях. На основе случайных чисел можно вычислять различные вероятности. Во всех языках программирования есть возможность использовать случайные числа.

  • CompareValue (A, B) - сравнивает два значения (Math).
  • IsInfinite (X) - определяет, равен ли аргумент бесконечному значению (Math).
  • IsNan (X) - определяет, не равен ли аргумент Nan – нечисловой величине (Math).
  • IsZero (X, Epsilon) - определяет, не является ли аргумент от нуля менее чем на Epsilon (Math).
  • Max (A,B) - максимум двух чисел (Math).
  • Min (A,B) - минимум двух чисел (Math).
  • SameValue (A, B, Epsilon) - сравнивает A и B с точностью Epsilon (Math).

Функции округления

  • Floor (X) - округляет до наибольшего целого, меньшего или равного аргумента (Math).
  • Ceil (X) - округляет до наименьшего целого (Math).
  • RoundTo (AValue, Adigit) - округляет действительное число до заданного десятичного порядка (Math).
  • Round (X) - возвращает ближайшее целое аргумента (Math).
  • Trunc (X) - возвращает целую часть действительного выражения (Math).

Выделяют значение

  • Frac (X) - возвращает дробную часть (Math).
  • Frexp (X, Mantissa, Exponent) - возвращает мантиссу и показатель степени 2 (Math).
  • Int (X) - возвращает целую часть аргумента (Math).

Операции

  • DivMod (Divided, Divisor, Result, Remainer) - целочисленное деление (Math).
  • IntPower (X,E) - возводит X в целую степень E (Math).
  • Ldepx (X,P) - умножение X на 2 в степени Р (Math).
  • Abs (X) - абсолютное значение (Math).
  • Power (X, E) - возведение X в произвольную степень (Math).
  • Sqr (X) - умножает X на X (Math).
  • Sqrt (X) - квадратный корень от X (Math).

Логарифмические функции

  • Exp (X) - экспонента (Math).
  • Ln (X) - натуральный логарифм (X) (Math).
  • LnXP1 (X) - натуральный логарифм (X+1) (Math).
  • Log10 (X) - десятичный логарифм от X (Math).
  • Log2 (X) - логарифм от X по основанию 2 (Math).
  • LogN (N, X) - логарифм от X по основанию N (Math).

Тригонометрические функции

  • ArcSin (X) - арксинус (Math).
  • ArcCos (X) - арккосинус (Math).
  • ArcTan (X) - арктангенс (Math).
  • ArcCot (X) - арккотангенс (Math).
  • ArcCsc (X) - арккосеканс (Math).
  • ArcSec (X) - арксеканс (Math).
  • ArcTan2 (Y, X) - арктангенс от Y/X (Math).
  • Cosecant (X), Csc (X) - косеканс (Math).
  • Hypot (X, Y) - гипотенуза по катетам X, Y (Math).
  • Sec (X), Secant (X) - секанс (Math).
  • Sin (X) - синус (Math).
  • SinCos (X, Y, C) - синус и косинус (Math).
  • Tan (X) - тангенс (Math).

Другие функции

  • EnsureRange (AValue, Amin, Amax) - возвращает ближайшее к Avalue значение в диапазоне Amin - Amax (Math).
  • Pi - число Пи (Math).
  • Poly (X,C) - вычисляет полином X с массивом коэффициентом С (Math).

Программист Delphi, MySQL. Образование: высшее. Специальность: программное обеспечение информационных технологий.