Программирование в 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.2011

  • Delphi - среда быстрой разработки, в которой в качестве языка программирования используется типизированный объектно-ориентированный язык 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

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.