Календарь на Май 2024 года: calendar2008.ru/2024/may/
Навигация
Главная »  Delphi 

Математика и Delphi (исходники)


Источник: articlesorg
Трофим Роцкий
Редкая программа обходится без простейших алгебраических действий:
"плюс", "минус", "разделить", "умножить" - их delphi понимает и заботливо выделяет
синим цветом. Но позже начинаются трудности. Стоит вам прописать что-то вроде edit1.text:= 'Координаты окна: ' + form1.left, + ', ' + form1.top, как компилятор выдает сообщение: "incompatible types: string and
integer". Что же это за типы и почему они несовместимы? Информация может быть различной: текстовой, графической, цифровой, в десяти,-
восьми,- шестнадцатеричной и т.п. системах. Чтобы корректно воспринимать ее,
в delphi, да и во всех других языках, введены переменные, или типы (types). В примере выше мы столкнулись с двумя из них, наиболее распространенными. string
- буквально "строка", текстовая информация. integer - простое число в
диапазоне -2147483648…2147483647. Хотя из ведра в сито перелить нельзя, добрый
borland предоставил нам функции для перевода из одного типа в другой (из модуля
sysutils.pas): function inttostr(value: integer): string; function strtoint(const s: string): integer; Обратите внимание на возвращаемые значения функций. Наш пример должен выглядеть
так: edit1.text:= 'Координаты окна: ' + inttostr(form1.left), + ', ' + inttostr(form1.top); form1.top:=strtoint(edit2.text); Посмотрите на вторую строчку кода. Значение edit2.text должно быть ТОЛЬКО числовым,
иначе вы получите сообщение об ошибке. А если нужно работать с иррациональными числами, например, с числом "пи"? Для таких данных существует свой тип: real. Переменной такого типа можно
присвоить значение параметра integer без всяких промежуточных функций,
но наоборот сделать нельзя. А чтобы увязать real с текстом, существуют
команды: function floattostr(value: extended): string; function strtofloat(const s: string): extended; тоже из модуля sysutils.pas. (Поэтому не забывайте декларировать этот модуль
при создании консольного приложения с математическими действиями.) Пропишите
что-нибудь вроде edit1.text:=floattostr(pi), чтобы оценить возможности переменной real.
С её помощью можно уже производить более серьезные вычисления, например, возведение
в квадрат посредством функции sqr(x: real) и извлечение
квадратного корня: sqrt(x: real), что в модуле system.pas.
Там же можно найти функции sin и cos с аналогичными параметрами.
Там, где синус с косинусом, должен быть тангенс и какой-никакой секонс, которые
и присутствуют в виде функций tan, cotan, cosecant, sec, arcsin, arccos,
arccot, arcsec и прочая в модуле math.pas. Модуль этот незаменим
также, если вы хотите возвести число в степень. function power(const base: extended; const exponent: extended):extended, где base - число, которое возводиться в степень, exponent
- показатель степени. form1.caption:=power(2,3); //возведение числа 2 в куб Вот еще некоторые сокровища модуля math: hypot - вычисление гипотенузы по длине катетов; radtodeg, degtorad - преобразование радианов в градусы
и наоборот; floor - округление в меньшую строну; ceil - округление в большую сторону; sincos - вычисление синуса и косинуса; mean - среднее арифметическое в комбинации чисел. (Например:
caption:=floattostr(mean([10,10,2])) - находит среднее арифметическое
трех данных чисел, но, конечно же, искомых чисел может быть и больше, и
меньше указанных в примере трех.) Часто бывает, что нужно прочертить прямую точно по центру image1, что невозможно
сделать делением параметра image1.width на два, поскольку в итоге почти всегда
получается иррациональное real-число. Мы воспользуемся командой div, вычисляющей результат деления - целое число -
без остатка. image1.canvas.moveto(image1.width div 2, 0); image1.canvas.lineto(image1.width div 2, image1.height); В настоящем примере ширина полотна image1 делится без остатка на два. Обратите
внимание, что делитель пишется не в скобках, а сразу после команды div. Как написать на delphi генератор случайных чисел? Командой random,
после которой в скобках указывается максимальная величина генерируемого числа. edit1.text:=inttostr(random(100)); //генератор случайных чисел в пределах
ста А сейчас мы применим наши математические познания и создадим утилиту для решения
квадратных уравнений вида: ax2+bx+c ? 0 Если вы учились в школе, то помните, что эти уравнения имеют два
корня, которые находятся по формуле х1,2 = (-b±2^(b^2+4ac))/2a Да, страшная формула… На форму бросайте компоненты trichedit, два
button'a - countbutton и exitbutton - и три labelededit'а, в которые вводятся,
соответственно, параметры a, b, c. Найдите у labelededit'ов свойство labelposition
и поставьте его в lpleft. Мы будем работать с параметрами a, b, с и дискриминантом (для тех, кто не знает,
- сумма квадрата b и учетверенного произведения a и c). В delphi таких переменных
нет, мы сами их придумали, а потому нужно продекларировать их в var. Удерживая нажатой клавишу shift, выберите все три labelededit'a
и по событию onkeypress поставьте у всех labelededit1keypress (и далее см. листинг): procedure tform1.labelededit1keypress(sender: tobject; var key: char);
begin
if not (key in ['0'..'9','-', char(vk_back)]) then begin //вводить можно только
числа
beep;
key:=#0;
end;
end; procedure tform1.closebuttonclick(sender: tobject);
begin
application.terminate; //гарантированно освобождает память - в отличие от close
end; procedure tform1.countbuttonclick(sender: tobject);
var
a, b, c,
diskrim,
x1, x2: real;
begin
//если а=0 - прерываем процесс
if (labelededit1.text='0') or (labelededit1.text=emptystr) then abort;
//если данные не введены - ставим 0
if labelededit2.text=emptystr then labelededit2.text:='0';
if labelededit3.text=emptystr then labelededit3.text:='0';
//инициализируем переменные
a:=strtofloat(labelededit1.text);
b:=strtofloat(labelededit2.text);
c:=strtofloat(labelededit3.text);
//находим дискриминант
diskrim:=sqr(b) + 4*a*c;
if diskrim < 0 then begin //если он меньше нуля, уравнение не имеет смысла
richedit1.clear;
richedit1.lines.add('d<0. Корней нет!');
abort; //прерываем процесс
end;
b:=b*-1; //х1 и х2
a:=a*2;
x1:=(b + sqrt(diskrim))/a;
x2:=(b - sqrt(diskrim))/a;
//выводим результаты
richedit1.clear;
richedit1.lines.add('Решение:' + #10 + #10 + 'Находим дискриминант: d = ' + floattostr(diskrim) + #10);
if diskrim > 0 then
richedit1.lines.add('d>0. Уравнение имеет 2 корня.'+ #10 +
'x1=' + floattostr(x1) + '; x2=' + floattostr(x2));
if diskrim = 0 then
richedit1.lines.add('d=0. Уравнение имеет 1 корень.' + #10 +
'x=' + floattostr(x1));
end; Ну вот мы и познакомились с некоторыми математическими возможностями.



 

 Нахождение кодировки веб-страницы..
 SQLBase 11.6.
 Упростите свои Delphi-приложения - Часть 2.
 Путеводитель по сертификации разработчиков.
 Разработка DLL в среде Borland Delphi.


Главная »  Delphi 

© 2024 Team.Furia.Ru.
Частичное копирование материалов разрешено.