В стандартной поставке 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) | Арктангенс аргумента х (аргумент в радианах) |
Функция | Описание |
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);
Запускаем калькулятор, и убеждаемся, что извлечение корня работает исправно:
Для расширения возможностей калькулятора следует установить дополнительные кнопки для
вычисления различных функций и создать соответствующие процедуры, способами,
рассмотренными в этом разделе.
Программист Delphi, MySQL. Образование: высшее. Специальность: программное обеспечение информационных технологий.
Что такое процедура? Это маленькая программа, выполняющая операции с указанными данными. Различают собственно процедуры и функции. Их основное отличие - процедура просто совершает какие-либо операции, а функция обязательно выдаёт какой-либо результат в результате своей работы. Существует огромное количество стандартных процедур и функций. Подпрограммы (так называют процедуры и функции) можно писать и самостоятельно, но об этом речь пойдёт позже. Сейчас нам нужно научиться работать с готовыми функциями.
Фактически, подпрограмма - это такая же полноценная программа, просто работает она не отдельно, не сама по себе, а включена в другую программу.
У подпрограммы всегда есть имя. Имя строится по тем же правилам, что и идентифмкатор. Как правило, имена даются вполне логичные. Например, если функция находит максимальное из нескольких чисел, то её логично назвать 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);
Зачем нужны случайные числа? Как правило, чтобы проверить результаты какого-то эксперимента при различных условиях. На основе случайных чисел можно вычислять различные вероятности. Во всех языках программирования есть возможность использовать случайные числа.