Математические возможности Delphi (Lazarus)




Содержание:
  • Встроенные математические функции
  • Функции модуля Math
  • Интерфейс калькулятора
  • Реализация калькулятора


  • Встроенные математические функции


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

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



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



       ©Гуков Константин Михайлович 2006 - 2015     Почта: [email protected]