(495) 925-0049, ITShop интернет-магазин 229-0436, Учебный Центр 925-0049
  Главная страница Карта сайта Контакты
Поиск
Вход
Регистрация
Рассылки сайта
 
 
 
 
 

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

Трофим Роцкий

Редкая программа обходится без простейших алгебраических действий:
"плюс", "минус", "разделить", "умножить" - их 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;

Ну вот мы и познакомились с некоторыми математическими возможностями.

Ссылки по теме


 Распечатать »
 Правила публикации »
  Написать редактору 
 Рекомендовать » Дата публикации: 25.01.2007 
 

Магазин программного обеспечения   WWW.ITSHOP.RU
SAP Crystal Reports 2008 INTL WIN NUL License
WinRAR 5.x 1 лицензия
Oracle Database Standard Edition 2 Processor License
ABBYY Lingvo x6 Английская Домашняя версия, электронный ключ
EMS Data Comparer for Oracle (Business) + 1 Year Maintenance
 
Другие предложения...
 
Курсы обучения   WWW.ITSHOP.RU
 
Другие предложения...
 
Магазин сертификационных экзаменов   WWW.ITSHOP.RU
 
Другие предложения...
 
3D Принтеры | 3D Печать   WWW.ITSHOP.RU
 
Другие предложения...
 
Новости по теме
 
Рассылки Subscribe.ru
Информационные технологии: CASE, RAD, ERP, OLAP
Новости ITShop.ru - ПО, книги, документация, курсы обучения
Программирование на Microsoft Access
CASE-технологии
СУБД Oracle "с нуля"
Компьютерные книги. Рецензии и отзывы
Мир OLAP и Business Intelligence: новости, статьи, обзоры
 
Статьи по теме
 
Новинки каталога Download
 
Исходники
 
Документация
 
 



    
rambler's top100 Rambler's Top100