Программирование в Delphi математических процессов
Использование объектно-ориентированной методологии при программировании математических процессов. Среда языка программирования Delphi для решения математических задач. Объектно-ориентированные, декларативные и императивные языки программирования.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | дипломная работа |
Язык | русский |
Дата добавления | 14.09.2011 |
Размер файла | 1,8 M |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
3.2.4 Метод прямоугольников
Для вычисления приближённого значения определённого интеграла отрезок [a, b] делят на n равных частей точками a=x0<x1<x2<…<xn=b так, что xi+1-xi= (b-a) /n (I=0,1,2,…,n-1). Тогда длина каждого частичного отрезка определяется как h= (b-a) /n, а точки разбиения x0=a, x1=x0+h, x2=x1+h,…, xn=xn-1+h. Эти точки называются узлами, а h-шагом интегрирования. В узлах вычисляются ординаты y0, y1,…, yn, т.е. yi=f (xi). На частичных отрезках [xi; xi+1] строятся прямоугольники, высота которых равна значению f (x) в какой-либо точке каждого частичного отрезка. Произведение f (xi) *h определяет площадь частичного прямоугольника, а сумма таких произведений - площадь ступенчатой фигуры, представляющей собой приближённое значение интеграла.
Если f (xi) вычисляется в левых концах отрезков [xi; xi+1], то получается формула левых прямоугольников:
Iл= (y0+y1+…+yn-1) = .
Если f (xi) вычисляется в правых концах отрезков [xi; xi+1], то получится формула правых прямоугольников:
Iп= (y1+y2+…+yn) = .
Если функция f вычисляется в точках xi+h/2 [xi;; xi+1], то получается формула средних прямоугольников:
(1)
3.2.5 Метод трапеции
Метод трапеций аналогичен методу прямоугольников, с той лишь разницей, что на каждом частичном отрезке строится трапеция.
Приближенное значение интеграла равно сумме всех площадей частичных трапеций:
I= (2)
3.2.6 Метод Симпсона
Если на частичном отрезке длиной 2h функции заменяется дугой параболы, то можно получить формулу парабол или обобщенную формулу Симпсона:
= (h/3) * (y0+y2n+ (3)
где 1 при i - нечетном;
Ci = 1 при i - чётном.
С автоматическим выбором шага.
Точность вычисления определенного интеграла зависит от величины шага интегрирования. Ошибка в выборе величины шага интегрирования либо не обеспечит нужной точности, либо приведет к необоснованным затратам машинного времени.
Заданную точность при рациональных затратах времени на вычисления обеспечивают алгоритмы интегрирования с автоматическим выбором шага. Идея метода автоматического выбора шага интегрирования для достижения заданной точности заключается в следующем:
а) выбирается начальное n и вычисляется шаг h= (b-a) /n;
б) рассчитывается значение интеграла I1 для этого шага h;
в) шаг h уменьшается в два раза, т.е. h=h/2 и вычисляется значение интеграла I2;
г) оценивается погрешность между двумя значениями r=I1-I2; если погрешность r меньше или равна заданной точности, т.е. r<=, то точность достигнута и значение интеграла I=I2; если r>, то точность не достигнута и величине I1 присваивается более точное значение I2;
д) теперь повторяются этапы в) и г) до выполнения условия r<=.
Программа «Интегралы» имеет следующий вид:
Данная программа вычисляет значение интеграла функции тремя методами. Интервал интегрирования, и параметр функции вводятся пользователем. Программа вычислит результат и выдаст его в числовом виде.
В строке Функция набираете какую-нибудь функцию, далее указываете Промежуток интегрирования от а до b, указываете число-n выбираете метод интегрирования и нажимаете на кнопку Вычислить, после того программа выдаст ответ в строке Результат.
3.2.7 Программа График функций
Наверное, всем приходилось иметь дело с графиками функций. Как выглядит, скажем, парабола или синусоида представляет себе каждый. А вот как выглядит график функции f(x)=Sin(x)+Cos(x), представит уже не всякий, хотя это тоже будет синусоида. Тем более никто сразу не скажет: как выглядит график функции f(x)=4*Sin(x)+3*Cos(7*x). Но, если Вы хорошо знаете математику, точнее математический анализ, то Вам не составит труда найти экстремумы функции, наибольшее и наименьшее значения функции. Тем самым вы сможете построить график функции. Но, к примеру, та, же функция f(x)= 4*Sin(x)+3*Cos(7*x) только на промежутке от 0 до пи имеет 7 экстремумов, построения ее графика у Вас уйдет немало времени.
Программный продукт График функций позволяет строить графики любых функций. Диалог пользователя с программой, а именно введение параметров, осуществляется посредством диалоговых окон программы.
Программа изучения графиков вводимых функций. y(x). В формуле могут быть использованы арифметические операции +-*/ , скобки, константы, а также набор пользовательских функций (sin, cos, tg, min, max, power, pi, Ln, e). При минимальном изменении модуля functions список пользователских функций может быть расширен. Количество параметров у пользовательских функцияй от 0 до 99.
Сама формула отображается в математическом красивом виде. Для отображения формулы использованы два сторонних модуля (ExprDraw, ExprMake).
При нажатии на третью ссылку Графики функций появляется окно, в котором уже по умолчанию построен график функции f(x)=sin(x) на отрезке [0,100], как показано на рисунке 3.4:
Чтобы построить необходимый график функции или изменить отрезок, на котором построен график на строке Формула вы можете изменять параметры функции. Начало и конец отрезка могут быть введены любые из отрезка [-1.7976931348623158e+308, 1.7976931348623158e+308], но при этом начало должно быть меньше конца отрезка, иначе появится сообщение об ошибке.
С функцией дело немного сложнее. Чтобы интерпретатор правильно понял функцию, при её вводе нужно пользоваться правилами.
Унарные операции:
cos(x) - косинус
sin(x) - синус
tg(x) = tan(x) - тангенс
ctg(x) - котангенс
arccos(x) = acos(x) - арккосинус
arcsin(x) = asin(x) - арксинус
arctg(x) = atan(x) - арктангенс
arcctg(x) - арккотангенс
round(x) - обычное округление до целого
sqr(x) - квадрат
sqrt(x) - арифметический корень
abs(x) = fabs(x) - модуль
neg(x) - отрицание
fact(x) - факториал
exp(x) - экспонента
ln(x) - натуральный логарифм
log10(x) = lg(x) - десятичный логарифм
cosh(x) - гиперболический косинус
sinh(x) - гиперболический синус
tanh(x) - гиперболический тангенс
floor(x) - округление с недостатком
ceil(x) - округление с избытком
sign(x) - знак числа
inv(x) - логическая инверсия
- - отрицание
Бинарные операции:
(по приоритету с наименьшего)
x+y = add (x, y) - сложение x с y
x-y = sub (x, y) - вычитание из x y
x*y = mul (x, y) - умножение x на y
x/y = div (x, y) - деление x на y
x&y = log (x, y) - логарифм от x по основанию y
x^y = pow (x, y) - возведение x в степень y
x=y = x==y = equal (x, y) - если x = y, то 1 иначе 0
x<y = less (x, y) - если x < y, то 1 иначе 0
x>y = greater (x, y) - если x > y, то 1 иначе 0
and (x, y) - логическое И
or (x, y) - логическое ИЛИ
xor (x, y) - логическое сложение по модулю 2 (операция, исключающая ИЛИ) - сумма Жегалкина
pirs (x, y) - стрелка Пирса
shef (x, y) - штих Шеффера
impl (x, y) - логическая импликация
eq (x, y) - логическая эквиваленция
less (x, y) - x<y?
greater (x, y) - x>y?
less_or_equal (x, y) - x<=y?
greater_or_equal (x, y) - x>=y?
max (x, y) - большее из x и y
min (x, y) - меньшее из x и y
equal (x, y) - эквиваленция
percent (x, y) - процент y от x
rand (x, y) - случайное число от x до y
Для всех логических операций число отличное от 0 это 1 (ПРАВДА), иначе 0 (ЛОЖЬ).
Числа пишутся в диапазоне [-1.7976931348623158e+308, 1.7976931348623158e+308]. Числа всегда записываются в десятичной форме, например 1 1f 1.0 1,0 1.0f 1,0f - одно и то же число в шести разных формах. Нельзя записывать числа в экспонентной форме, например 2.3e-5, вместо этого 2.3*(10^-5). Можно использовать константы: pi - число р, e - число e. Переменной является буква x. Между функциями можно ставить разделитель - пробел(space).
Нажимая указателем мыши на ссылку О программе в главной форме (см. рис 3.1.) вы можете увидеть последнюю форму, которая содержит информацию об авторе создавшую эту программу
3.3 Требования к данной версии программы
Гарантируется работа данной программы в операционной системе Windows не ниже 98. В предыдущих версиях работа программы не проверялась.
При работе с программой нужно пользоваться правилами, которые приведены в разделе Описание работы программного продукта. В этом случае гарантируется правильная работа программы. Причем нужно обязательно соблюдать правила ввода функции, интерпретатор в этом случае поймет функцию правильно. Если в поле ввода функции ввести что-то неоговоренное правилами, интерпретатор примет это значение в любом случае, и не будет выведено никакого сообщения. Интерпретатор поймет, то что сможет распознать, остальное он игнорирует. Например, если будет введено “zxczxc” или пустая строка, то функция воспримется, как f(x)=0. Если будет введено “dghld+sin(x)asdfasf+dfgdfg”, то функция воспримется, как f(x)=sin(x).
3.3.1 Подготовка к работе
Запуск и корректное функционирование приложения возможны только при соблюдении минимальных требований к аппаратному и программному обеспечению, в противном случае, сразу после запуска, приложение перестает отвечать на запросы пользователя. В последнем случае следует завершить работу приложения и правильно настроить аппаратные и программные средства.
3.3.2 Запуск программы
1. Распаковать архив, например на диск С:
2. Запустить файл Программирование математических процессов.exe, имеющий значок в соответствии с рисунком 3.5.
Заключение
Компьютер предоставляет удобную возможность использования вычислительных мощностей для решения трудоемких и объемных математических задач. Многие задачи, которые раньше (до изобретения компьютера) либо не имели решения, либо оно было очень долгим, теперь возможно решать в считанные секунды. Задачи, которые нельзя решить аналитически, можно решить с использованием различных численных методов. И здесь язык Delphi выступает как достаточно удобное и простое средство для перевода алгоритма в компьютерную программу, которую сможет использовать большое количество людей.
Написанная мною программа состоит из трех ключевых составляющих подпрограмм, позволяет решать важнейшую задачу математического анализа, такие как:
1) решение квадратного уравнения;
2) вычисления определенного интеграла;
3) построение графиков функций.
Первая подпрограмма решает квадратное уравнение, которая часто используется в математике.
Вторая программа вычисляет значение интеграла функции тремя методами. Она может облегчить работу исследования функций.
Третья позволяет строить графики любых функций.
Реализация данного проекта была проведена в Delphi 7.0 Использование мощных средств по созданию приложений работающих в операционной системе Windows. Программа написана при использовании самых современных на сегодняшний день технологий программирования и обеспечивает быструю и качественную работу.
В результате спроектирована программа, позволяющий обрабатывать, изменять информацию и автоматизировать некий математический процесс, что является основной задачей представленной выпускной работы. Программа «программирование математических процессов» может быть использовано для учебных целей.
Список используемой литературы
1. Бобровский С. Delphi5: учебный курс.Спб: Питер,2001. 640с.;
2. Климова Л.М. Delphi 7. Основы программирования.М.:Кудиц-Образ,2004. 480с.;
3. Фаронов В. Программирование баз данных в Dephi 7: учебный курс.Спб: Питер,2003. 459с.
4. В.Гофман, А.Хомоненко. Delphi 6: СПб.:БХВ-Петербург, 2001.-1152с.:ил.
5. Delphi 5.0, учебный курс, Фараонов В.В., ISBN 5-8952-020-4, 400
6. Delphi 4.0, Дарахвелидзе П.Г., Марков Е. П. 1998, 816 с.
7. Сайт http://delhpi.mastak.ru
Приложение: Листинг программы
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, jpeg, ExtCtrls, Buttons, MPlayer;
type
TForm1 = class(TForm)
Image1: TImage;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
BitBtn1: TBitBtn;
MediaPlayer1: TMediaPlayer;
procedure Label1Click(Sender: TObject);
procedure Label2Click(Sender: TObject);
procedure Label3Click(Sender: TObject);
procedure Label4Click(Sender: TObject);
procedure FormActivate(Sender: TObject);
private
{Private declarations}
public
{Public declarations}
end;
var
Form1: TForm1;
implementation
uses Unit2;
{$R *.dfm}
procedure TForm1.Label1Click(Sender: TObject);
begin
Form2.show;
end;
procedure TForm1.Label2Click(Sender: TObject);
begin
Form3.show;
end;
procedure TForm1.Label3Click(Sender: TObject);
begin
Form4.show;
end;
procedure TForm1.Label4Click(Sender: TObject);
begin
AboutBox.show;
end;
procedure TForm1.FormActivate(Sender: TObject);
begin
MediaPlayer1.Play;
end;
unit uMain;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, Spin, ExtCtrls;
type
TfmMain = class(TForm)
laFactors: TLabel;
laAFactor: TLabel;
sedAFactor: TSpinEdit;
laBFactor: TLabel;
sedBFactor: TSpinEdit;
laCFactor: TLabel;
sedCFactor: TSpinEdit;
btCalc: TButton;
laX1: TLabel;
laX2: TLabel;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure btCalcClick(Sender: TObject);
private
public
end;
var
fmMain: TfmMain;
implementation
{$R *.DFM}
type
TOperandType = Double;
TOperands = packed record
dO1, dO2: TOperandType;
end;
const
Copyright = 'Multitasking Copyright © 2007 Loonies Software';
MailslotPrefix = '\\.\mailslot\';
MulOpsReadyEventName = Copyright + ' - Mul_OpsReady';
MulResReadyEventName = Copyright + ' - Mul_ResReady';
MulMailslotOpsName = MailslotPrefix + 'Lab2_Mul_Operands';
MulMailslotResName = MailslotPrefix + 'Lab2_Mul_Result';
DivOpsReadyEventName = Copyright + ' - Div_OpsReady';
DivResReadyEventName = Copyright + ' - Div_ResReady';
DivMailslotOpsName = MailslotPrefix + 'Lab2_Div_Operands';
DivMailslotResName = MailslotPrefix + 'Lab2_Div_Result';
SubOpsReadyEventName = Copyright + ' - Sub_OpsReady';
SubResReadyEventName = Copyright + ' - Sub_ResReady';
SubMailslotOpsName = MailslotPrefix + 'Lab2_Sub_Operands';
SubMailslotResName = MailslotPrefix + 'Lab2_Sub_Result';
AddOpsReadyEventName = Copyright + ' - Add_OpsReady';
AddResReadyEventName = Copyright + ' - Add_ResReady';
AddMailslotOpsName = MailslotPrefix + 'Lab2_Add_Operands';
AddMailslotResName = MailslotPrefix + 'Lab2_Add_Result';
RootOpsReadyEventName = Copyright + ' - Root_OpsReady';
RootResReadyEventName = Copyright + ' - Root_ResReady';
RootMailslotOpsName = MailslotPrefix + 'Lab2_Root_Operands';
RootMailslotResName = MailslotPrefix + 'Lab2_Root_Result';
var
hMulOpsReadyEvent, hDivOpsReadyEvent, hSubOpsReadyEvent, hAddOpsReadyEvent, hRootOpsReadyEvent,
hMulResReadyEvent, hDivResReadyEvent, hSubResReadyEvent, hAddResReadyEvent, hRootResReadyEvent: THandle;
MulThreadHandle, DivThreadHandle, SubThreadHandle, AddThreadHandle, RootThreadHandle: THandle;
hMulResMailslot, hDivResMailslot, hSubResMailslot, hAddResMailslot, hRootResMailslot: THandle;
procedure MulThreadProc(lpParameter: Pointer);
var
OpsReadyEvent, ResReadyEvent: THandle;
OpsMailslot, ResMailslot: THandle;
Operands: TOperands;
Res: TOperandType;
ReadBytes, WrittenBytes: DWORD;
begin
OpsReadyEvent:=OpenEvent(EVENT_ALL_ACCESS, false, MulOpsReadyEventName);
ResReadyEvent:=OpenEvent(EVENT_ALL_ACCESS, false, MulResReadyEventName);
OpsMailslot:=CreateMailslot(MulMailslotOpsName, 0, MAILSLOT_WAIT_FOREVER, nil);
ResMailslot:=CreateFile(MulMailslotResName, GENERIC_WRITE, FILE_SHARE_READ, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
while WaitForSingleObject(OpsReadyEvent, INFINITE) = WAIT_OBJECT_0 do
begin
ResetEvent(OpsReadyEvent);
ReadFile(OpsMailslot, Operands, SizeOf(TOperands), ReadBytes, nil);
Res:=Operands.dO1 * Operands.dO2;
WriteFile(ResMailslot, Res, SizeOf(TOperandType), WrittenBytes, nil);
SetEvent(ResReadyEvent);
end;
CloseHandle(OpsMailslot);
CloseHandle(ResMailslot);
ExitThread(0);
end;
procedure DivThreadProc(lpParameter: Pointer);
var
OpsReadyEvent, ResReadyEvent: THandle;
OpsMailslot, ResMailslot: THandle;
Operands: TOperands;
Res: TOperandType;
ReadBytes, WrittenBytes: DWORD;
begin
OpsReadyEvent:=OpenEvent(EVENT_ALL_ACCESS, false, DivOpsReadyEventName);
ResReadyEvent:=OpenEvent(EVENT_ALL_ACCESS, false, DivResReadyEventName);
OpsMailslot:=CreateMailslot(DivMailslotOpsName, 0, MAILSLOT_WAIT_FOREVER, nil);
ResMailslot:=CreateFile(DivMailslotResName, GENERIC_WRITE, FILE_SHARE_READ, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
while WaitForSingleObject(OpsReadyEvent, INFINITE) = WAIT_OBJECT_0 do
begin
ResetEvent(OpsReadyEvent);
ReadFile(OpsMailslot, Operands, SizeOf(TOperands), ReadBytes, nil);
Res:=Operands.dO1 / Operands.dO2;
WriteFile(ResMailslot, Res, SizeOf(TOperandType), WrittenBytes, nil);
SetEvent(ResReadyEvent);
end;
CloseHandle(OpsMailslot);
CloseHandle(ResMailslot);
ExitThread(0);
end;
procedure SubThreadProc(lpParameter: Pointer);
var
OpsReadyEvent, ResReadyEvent: THandle;
OpsMailslot, ResMailslot: THandle;
Operands: TOperands;
Res: TOperandType;
ReadBytes, WrittenBytes: DWORD;
begin
OpsReadyEvent:=OpenEvent(EVENT_ALL_ACCESS, false, SubOpsReadyEventName);
ResReadyEvent:=OpenEvent(EVENT_ALL_ACCESS, false, SubResReadyEventName);
OpsMailslot:=CreateMailslot(SubMailslotOpsName, 0, MAILSLOT_WAIT_FOREVER, nil);
ResMailslot:=CreateFile(SubMailslotResName, GENERIC_WRITE, FILE_SHARE_READ, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
while WaitForSingleObject(OpsReadyEvent, INFINITE) = WAIT_OBJECT_0 do
begin
ResetEvent(OpsReadyEvent);
ReadFile(OpsMailslot, Operands, SizeOf(TOperands), ReadBytes, nil);
Res:=Operands.dO1 - Operands.dO2;
WriteFile(ResMailslot, Res, SizeOf(TOperandType), WrittenBytes, nil);
SetEvent(ResReadyEvent);
end;
CloseHandle(OpsMailslot);
CloseHandle(ResMailslot);
ExitThread(0);
end;
procedure AddThreadProc(lpParameter: Pointer);
var
OpsReadyEvent, ResReadyEvent: THandle;
OpsMailslot, ResMailslot: THandle;
Operands: TOperands;
Res: TOperandType;
ReadBytes, WrittenBytes: DWORD;
begin
OpsReadyEvent:=OpenEvent(EVENT_ALL_ACCESS, false, AddOpsReadyEventName);
ResReadyEvent:=OpenEvent(EVENT_ALL_ACCESS, false, AddResReadyEventName);
OpsMailslot:=CreateMailslot(AddMailslotOpsName, 0, MAILSLOT_WAIT_FOREVER, nil);
ResMailslot:=CreateFile(AddMailslotResName, GENERIC_WRITE, FILE_SHARE_READ, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
while WaitForSingleObject(OpsReadyEvent, INFINITE) = WAIT_OBJECT_0 do
begin
ResetEvent(OpsReadyEvent);
ReadFile(OpsMailslot, Operands, SizeOf(TOperands), ReadBytes, nil);
Res:=Operands.dO1 + Operands.dO2;
WriteFile(ResMailslot, Res, SizeOf(TOperandType), WrittenBytes, nil);
SetEvent(ResReadyEvent);
end;
CloseHandle(OpsMailslot);
CloseHandle(ResMailslot);
ExitThread(0);
end;
procedure RootThreadProc(lpParameter: Pointer);
var
OpsReadyEvent, ResReadyEvent: THandle;
OpsMailslot, ResMailslot: THandle;
Operands: TOperands;
Res: TOperandType;
ReadBytes, WrittenBytes: DWORD;
begin
OpsReadyEvent:=OpenEvent(EVENT_ALL_ACCESS, false, RootOpsReadyEventName);
ResReadyEvent:=OpenEvent(EVENT_ALL_ACCESS, false, RootResReadyEventName);
OpsMailslot:=CreateMailslot(RootMailslotOpsName, 0, MAILSLOT_WAIT_FOREVER, nil);
ResMailslot:=CreateFile(RootMailslotResName, GENERIC_WRITE, FILE_SHARE_READ, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
while WaitForSingleObject(OpsReadyEvent, INFINITE) = WAIT_OBJECT_0 do
begin
ResetEvent(OpsReadyEvent);
ReadFile(OpsMailslot, Operands, SizeOf(TOperands), ReadBytes, nil);
Res:=Sqrt(Operands.dO1);
WriteFile(ResMailslot, Res, SizeOf(TOperandType), WrittenBytes, nil);
SetEvent(ResReadyEvent);
end;
CloseHandle(OpsMailslot);
CloseHandle(ResMailslot);
ExitThread(0);
end;
procedure TfmMain.FormCreate(Sender: TObject);
var
ThreadId: DWORD;
begin
hMulOpsReadyEvent:=CreateEvent(nil, true, false, MulOpsReadyEventName);
hDivOpsReadyEvent:=CreateEvent(nil, true, false, DivOpsReadyEventName);
hSubOpsReadyEvent:=CreateEvent(nil, true, false, SubOpsReadyEventName);
hAddOpsReadyEvent:=CreateEvent(nil, true, false, AddOpsReadyEventName);
hRootOpsReadyEvent:=CreateEvent(nil, true, false, RootOpsReadyEventName);
hMulResReadyEvent:=CreateEvent(nil, true, false, MulResReadyEventName);
hDivResReadyEvent:=CreateEvent(nil, true, false, DivResReadyEventName);
hSubResReadyEvent:=CreateEvent(nil, true, false, SubResReadyEventName);
hAddResReadyEvent:=CreateEvent(nil, true, false, AddResReadyEventName);
hRootResReadyEvent:=CreateEvent(nil, true, false, RootResReadyEventName);
hMulResMailslot:=CreateMailslot(MulMailslotResName, 0, MAILSLOT_WAIT_FOREVER, nil);
hDivResMailslot:=CreateMailslot(DivMailslotResName, 0, MAILSLOT_WAIT_FOREVER, nil);
hSubResMailslot:=CreateMailslot(SubMailslotResName, 0, MAILSLOT_WAIT_FOREVER, nil);
hAddResMailslot:=CreateMailslot(AddMailslotResName, 0, MAILSLOT_WAIT_FOREVER, nil);
hRootResMailslot:=CreateMailslot(RootMailslotResName, 0, MAILSLOT_WAIT_FOREVER, nil);
MulThreadHandle:=CreateThread(nil, 0, @MulThreadProc, nil, 0, ThreadId);
DivThreadHandle:=CreateThread(nil, 0, @DivThreadProc, nil, 0, ThreadId);
SubThreadHandle:=CreateThread(nil, 0, @SubThreadProc, nil, 0, ThreadId);
AddThreadHandle:=CreateThread(nil, 0, @AddThreadProc, nil, 0, ThreadId);
RootThreadHandle:=CreateThread(nil, 0, @RootThreadProc, nil, 0, ThreadId);
end;
procedure TfmMain.FormDestroy(Sender: TObject);
begin
CloseHandle(hMulOpsReadyEvent);
CloseHandle(hDivOpsReadyEvent);
CloseHandle(hSubOpsReadyEvent);
CloseHandle(hAddOpsReadyEvent);
CloseHandle(hRootOpsReadyEvent);
CloseHandle(hMulResReadyEvent);
CloseHandle(hDivResReadyEvent);
CloseHandle(hSubResReadyEvent);
CloseHandle(hAddResReadyEvent);
CloseHandle(hRootResReadyEvent);
CloseHandle(hMulResMailslot);
CloseHandle(hDivResMailslot);
CloseHandle(hSubResMailslot);
CloseHandle(hAddResMailslot);
CloseHandle(hRootResMailslot);
TerminateThread(MulThreadHandle, 0);
CloseHandle(MulThreadHandle);
TerminateThread(DivThreadHandle, 0);
CloseHandle(DivThreadHandle);
TerminateThread(SubThreadHandle, 0);
CloseHandle(SubThreadHandle);
TerminateThread(AddThreadHandle, 0);
CloseHandle(AddThreadHandle);
TerminateThread(RootThreadHandle, 0);
CloseHandle(RootThreadHandle);
end;
procedure WriteOperandsUsingFileMapping(OpsMailslotName: PChar; Operands: TOperands; hEvent: THandle);
var
OpsMailslot: THandle;
WrittenBytes: DWORD;
begin
OpsMailslot:=CreateFile(OpsMailslotName, GENERIC_WRITE, FILE_SHARE_READ, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
WriteFile(OpsMailslot, Operands, SizeOf(TOperands), WrittenBytes, nil);
CloseHandle(OpsMailslot);
SetEvent(hEvent);
end;
function ReadResultUsingFileMapping(hResReadyEvent: THandle; MailslotHandle: THandle): TOperandType;
var
Res: TOperandType;
ReadBytes: DWORD;
begin
if WaitForSingleObject(hResReadyEvent, INFINITE) = WAIT_OBJECT_0 then
begin
ReadFile(MailslotHandle, Res, SizeOf(TOperandType), ReadBytes, nil);
Result:=Res;
end;
end;
procedure TfmMain.btCalcClick(Sender: TObject);
var
Operands: TOperands;
dRes, dRes2, dRes3: Double;
A, B, C: Integer;
begin
A:=sedAFactor.Value;
B:=sedBFactor.Value;
C:=sedCFactor.Value;
Operands.dO1:=B;
Operands.dO2:=B;
WriteOperandsUsingFileMapping(MulMailslotOpsName, Operands, hMulOpsReadyEvent);
dRes:=ReadResultUsingFileMapping(hMulResReadyEvent, hMulResMailslot);
Operands.dO1:=4;
Operands.dO2:=A;
WriteOperandsUsingFileMapping(MulMailslotOpsName, Operands, hMulOpsReadyEvent);
dRes2:=ReadResultUsingFileMapping(hMulResReadyEvent, hMulResMailslot);
Operands.dO1:=dRes2;
Operands.dO2:=C;
WriteOperandsUsingFileMapping(MulMailslotOpsName, Operands, hMulOpsReadyEvent);
dRes2:=ReadResultUsingFileMapping(hMulResReadyEvent, hMulResMailslot);
Operands.dO1:=dRes;
Operands.dO2:=dRes2;
WriteOperandsUsingFileMapping(SubMailslotOpsName, Operands, hSubOpsReadyEvent);
dRes3:=ReadResultUsingFileMapping(hSubResReadyEvent, hSubResMailslot);
if dRes3 < 0 then
begin
laX1.Caption:='Дискриминант меньше нуля!';
laX2.Caption:='';
end
else
begin
Operands.dO1:=0;
Operands.dO2:=B;
WriteOperandsUsingFileMapping(SubMailslotOpsName, Operands, hSubOpsReadyEvent);
dRes:=ReadResultUsingFileMapping(hSubResReadyEvent, hSubResMailslot);
Operands.dO1:=dRes3;
WriteOperandsUsingFileMapping(RootMailslotOpsName, Operands, hRootOpsReadyEvent);
dRes3:=ReadResultUsingFileMapping(hRootResReadyEvent, hRootResMailslot);
Operands.dO1:=dRes;
Operands.dO2:=dRes3;
WriteOperandsUsingFileMapping(AddMailslotOpsName, Operands, hAddOpsReadyEvent);
dRes2:=ReadResultUsingFileMapping(hAddResReadyEvent, hAddResMailslot);
Operands.dO1:=dRes;
Operands.dO2:=dRes3;
WriteOperandsUsingFileMapping(SubMailslotOpsName, Operands, hSubOpsReadyEvent);
dRes:=ReadResultUsingFileMapping(hSubResReadyEvent, hSubResMailslot);
Operands.dO1:=2;
Operands.dO2:=A;
WriteOperandsUsingFileMapping(MulMailslotOpsName, Operands, hMulOpsReadyEvent);
dRes3:=ReadResultUsingFileMapping(hMulResReadyEvent, hMulResMailslot);
Operands.dO1:=dRes;
Operands.dO2:=dRes3;
WriteOperandsUsingFileMapping(DivMailslotOpsName, Operands, hDivOpsReadyEvent);
dRes:=ReadResultUsingFileMapping(hDivResReadyEvent, hDivResMailslot);
Operands.dO1:=dRes2;
Operands.dO2:=dRes3;
WriteOperandsUsingFileMapping(DivMailslotOpsName, Operands, hDivOpsReadyEvent);
dRes2:=ReadResultUsingFileMapping(hDivResReadyEvent, hDivResMailslot);
laX1.Caption:='x1 = ' + FloatToStrF(dRes, ffFixed, 15, 2);
laX2.Caption:='x2 = ' + FloatToStrF(dRes2, ffFixed, 15, 2);
end;
end;
unit grfunc;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;
type
TForm1 = class(TForm)
procedure FormPaint(Sender: TObject);
procedure FormResize(Sender: TObject);
private
{Private declarations}
public
{Public declarations}
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
Function f(x:real):real; // Функция, график которой надо построить
begin
f:=2*Sin(x)*exp(x/5);
end;
procedure GrOfFunc; // строит график функции
var
x1,x2:real; // границы изменения аргумента функции
y1,y2:real; // границы изменения значения функции
x:real; // аргумент функции
y:real; // значение функции в точке x
dx:real; // приращение аргумента
l,b:integer; // левый нижний угол области вывода графика
w,h:integer; // ширина и высота области вывода графика
mx,my:real; // масштаб по осям X и Y
x0,y0:integer; // точка - начало координат
begin
// область вывода графика
l:=10; // X - координата левого верхнего угла
b:=Form1.ClientHeight-20; // Y - координата левого верхнего угла
h:=Form1.ClientHeight-40; // высота
w:=Form1.Width-40; // ширина
x1:=0; // нижняя граница диапазона аргумента
x2:=25; // верхняя граница диапазона аргумента
dx:=0.01; // шаг аргумента
y1:=f(x1); // минимум
y2:=f(x1); // максимум
x:=x1;
repeat
y := f(x);
if y < y1 then y1:=y;
if y > y2 then y2:=y;
x:=x+dx;
until (x>=x2);
my:=h/abs(y2-y1); //
mx:=w/abs(x2-x1); //
// оси
x0:=l;
y0:=b-Abs(Round(y1*my));
with form1.Canvas do
begin
MoveTo(l,b);LineTo(l,b-h);
MoveTo(x0,y0);LineTo(x0+w,y0);
TextOut(l+5,b-h,FloatToStrF(y2,ffGeneral,6,3));
TextOut(l+5,b,FloatToStrF(y1,ffGeneral,6,3));
// построение графика
x:=x1;
repeat
y:=f(x);
Pixels[x0+Round(x*mx),y0-Round(y*my)]:=clRed;
x:=x+dx;
until (x>=x2);
end;
end;
procedure TForm1.FormPaint(Sender: TObject);
begin
GrOfFunc;
end;
// изменился размер окна программы
procedure TForm1.FormResize(Sender: TObject);
begin
form1.Canvas.FillRect(Rect(0,0,ClientWidth,ClientHeight));
// построить график
GrOfFunc;
end;
end;
end.
Размещено на Allbest.ru
Подобные документы
Предмет объектно-ориентированного программирования и особенности его применения в средах Паскаль, Ада, С++ и Delphi. Интегрированная среда разработки Delphi: общее описание и назначение основных команд меню. Процедуры и функции программы Delphi.
курсовая работа [40,8 K], добавлен 15.07.2009История развития, характеристика, предназначение и особенности языка программирования Delphi. Разработка проекта создания кроссворда на объектно-ориентированном языке Delphi, который состоит из 19 вопросов по горизонтали и 16 вопросов по вертикали.
курсовая работа [970,5 K], добавлен 15.05.2014Анализ предметной области объектно-ориентированного программирования. Языки Delphi, Object Pascal - объектно-ориентированная среда программирования. Основные алгоритмические решения. Решение дифференциального уравнения методом Рунге-Кутта в среде Excel.
курсовая работа [1,5 M], добавлен 02.04.2011Delphi - среда быстрой разработки, в которой в качестве языка программирования используется типизированный объектно-ориентированный язык Delphi. Варианты программного пакета. Особенности работы, вид экрана после запуска. Описание структуры программы.
курсовая работа [1,3 M], добавлен 25.11.2014Эволюция языков программирования от низкого уровня до современности. Языки программирования второго поколения - ассемблер. Императивные, функциональные, логические и объектно-ориентированные языки. Машинная независимость. Парадигмы программирования.
презентация [353,5 K], добавлен 14.10.2013Использование объектно-ориентированного программирования - хорошее решение при разработке крупных программных проектов. Объект и класс как основа объектно-ориентированного языка. Понятие объектно-ориентированных языков. Языки и программное окружение.
контрольная работа [60,1 K], добавлен 17.01.2011Теоретические основы объектно-ориентированного языка программирования Delphi, изучение среды визуального проектирования приложений. Определение 40-го числа Фибоначчи, составление листинга и блок-схемы программы, тестирование ее на работоспособность.
курсовая работа [261,1 K], добавлен 25.03.2015Особенности разработки приложений для операционной системы с помощью императивного, структурированного, объектно-ориентированного языка программирования Delphi. Формальное начало программы. Выделение конца программного блока. Листинг и описание программы.
курсовая работа [1,2 M], добавлен 04.08.2014Объектно-ориентированные языки программирования. Среда разработки приложений Delphi и ее элементы. Разработка программного приложения. Описание работы системы "Абитуриент", являющейся хранилищем данных об абитуриентах, поступающих в учебное заведение.
курсовая работа [1,8 M], добавлен 09.11.2011Основные этапы развития языков программирования. Характеристика машинно-ориентированной, проблемно-ориентированной и процедурно-ориентированной систем программирования. Ознакомление с системами программирования Delphi, Visual Basic и Visual C++.
курсовая работа [102,4 K], добавлен 21.07.2012