Функционально-структурная схема
Рис. 1- Функционально-структурная схема Иерархия форм
Рис.2 - Главная форма
Рис. 3– API –функции
Рис.4 – Главная форма (прорисовка графиков)
Рис.5 -Наглядный метод решения
Рис.6 - Настройки
Рис 7 – Главная форма для вычисления интеграла Работа с программой начинается с этой формы. На этой форме вы можете рассчитать интеграл: 1. Выбрать интеграл 2. Выбрать метод (трапеций, Симпсона) 3. Ввести верхний предел интеграла 4. Ввести нижний предел интеграла 5. Ввести число разбиений 6. Нажав клавишу «Вперед» вычислить значение интеграла
Рис 8 – Форма для прорисовки графиков
На этой форме можно получить значения интегралов в зависимости от значений нижней границы при фиксированных значениях верхней границы определенного интеграла и построить графики 1. Выбрать интеграл 2. Нажать клавишу «График» и получить график выбранного вами интеграла
Рис 9 - Таблицы
На этой форме показан более детально метод нахождения интегралов. Форма для применения функции Windows API SetForegroundWindow ( HWND : hwnd ); Рис 10 – API –функции
На этой форме можно применить функцию SetForegroundWindow ( HWND : hwnd ) путем нажатия клавиши«Применить». Форма для применения функции Windows API SetCurrentDirectory ( IpPathName : PChar ): bool ;
Рис.11 – API-функции
На этой форме можно применить функцию SetCurrentDirectory ( IpPathName : PChar ): bool ; путем нажатия клавиши«Применить». Форма настроек главной формы
Рис.12 - Настройки
На этой форме расположены настройки с помощью которых настраивается цвет и шрифты главной формы.
Элементы главной формы
Событие | |||||||||||||||
Bitgraf | Кнопка для запуска процедуры прорисовки графиков | BitgrafClick | |||||||||||||
Buclear | Кнопка для очистки поля для вывода значений интегралов | BuclearClick | |||||||||||||
Burun | Кнопка для запуска процедуры вычисления интегралов | BurunClick | |||||||||||||
Cbint | Переключатель для выбора интеграла | CbintChange | |||||||||||||
CBmet | Переключатель для выбора метода решения |
| |||||||||||||
ColorDialog | Палитра для выбора цвета |
| |||||||||||||
DateTimePicker | Календарь (день,месяц,год) |
| |||||||||||||
Edzn1 | Поле для ввода нижнего предела интеграла |
| |||||||||||||
Edzn2 | Поле для ввода верхнего предела интеграла |
| |||||||||||||
Gauge | Компонент для визуального отображения степени завершенности некоторой длительной орерации или процесса |
| |||||||||||||
Imgraf | Поле для вывода графически результатов вычисления |
| |||||||||||||
Imint | Поле для вывода графического изображения интеграла |
| |||||||||||||
Kurs | Главная форма | MainMenu FormCreate | |||||||||||||
LbCbint | Метка которая указывает на переключатель Cbint |
| |||||||||||||
LbCbmet | Метка которая указывает на переключатель Cb met |
| |||||||||||||
LbEdzn1 | Метка которая указывает поле Edzn1 |
| |||||||||||||
LbEdzn2 | Метка которая указывает поле Edzn2 |
| |||||||||||||
LbintGraf | Метка которая указывает поле Imgraf |
| |||||||||||||
MMoutput | Поле для вывода значений припостроении графика |
| |||||||||||||
LbznGr | Метка которая указывает поле MMoutput |
| |||||||||||||
N22 S etCurrentDirectory | Пункт меню для применении функции S etCurrentDirectory | N22GetCurrentDirectory1Click | |||||||||||||
N52SetForegroundWindow1Click | Пункт меню для применении функции SetForegroundWindow | N52SetForegroundWindow1Click | |||||||||||||
RBint1 | Переключатель для построения графика на первый интеграл | RBint1Click | |||||||||||||
RBint2 | Переключатель для построения графика на второй интеграл | RBint2Click | |||||||||||||
StatusBar | Строка для вывода подсказок | ||||||||||||||
Функции Windows API
SetForeGroundWindow function SetForegroundWindow(hWnd: HWND): BOOL;
Функция SetForegroundWindow(HWND:hwnd) предназначена для перевода окна, которое идентифицируемо пораметром hwnd,в" верхний слой " и перевода на него фокус, независимо от того, какой поток создал это окно.
SetForegroundWindow( HWND hWnd // Маркер(дескриптор) окна, чтобы перенести к переднему плану)
Параметры
hWnd -дискриптор окна который идентифицирует окно, которое должно быть активизировано и перенесено к переднему плану.
Применение:
procedure TForm2.Timer1Timer(Sender: TObject);
begin
SetForegroundWindow(kurs.Handle);
Timer1.Enabled:=false;
end;
Обработчиком события является таймер (Timer1Timer) который и запускает функцию
SetCurrentDirectory
function SetCurrentDirectory(lpPathName: PChar): BOOL;
Функция SetCurrentDirectory(‘lpPathName: PChar ‘) изменяет (устанавливает) текущий каталог. Возвращаемое значение было бы True, если текущий каталог был успешно изменен(заменен), или False, если ошибка произошла.
SetCurrentDirectory(
lpPathName // Адрес названия(имени) нового текущего каталога );
Параметры
LpPathName
Укажите на строку с нулевым символом в
конце, которая определяет путь к новому текущему каталогу.
Применение:
procedure TForm3.Button1Click(Sender: TObject);
begin
SetCurrentDirectory('c:\');
end;
Обработчиком события является кнопка (Button1Click) который и запускает функцию.
Основные процедуры
Расчет интегралов
procedure TKurs.CbintChange(Sender: TObject);
begin
if CBint.Text='Интеграл №1' then
Imint.Picture.LoadFromFile('int.bmp') else
Imint.Picture.LoadFromFile('int1.bmp');
end;
procedure TKurs.BurunClick(Sender: TObject);
begin
try
try
a:=strtoint(Edzn1.text);
b:=strtoint(Edzn2.text);
n:=strtoint(Edit3.Text);
If (Cbint.Text='Интеграл №1') then
int:=f1;
if (CBmet.Text='Методом Симпсона') then
int1(a,b,n,ss);
if (CBint.Text='Интеграл №1') then
int:=f1;
if (CBmet.Text='Методом трапеций') then
int2(a,b,n,ss);
if (Cbint.Text='Интеграл №2') then
int:=f2;
if (CBmet.Text='Методом Симпсона')then
int1(a,b,n,ss);
if (CBint.Text='Интеграл №2') then
int:=f2;
if (CBmet.Text='Методом трапеций')then
int2(a,b,n,ss);
Memo1.Lines.Add(' '+CBint.Text);
Memo1.Lines.Add((CBmet.Text)+' = '+(FloatToStrF(ss,ffNumber,9,3)));
except
on EConvertError do
begin
raise Exception.Create('Внимание!Ошибка в записи числа!');
end;
end;
finally
if (a)>(b)
then
ShowMessage('Вверхняя граница должна быть больше нижней');
end;
end;
procedure TKurs.FormCreate(Sender: TObject);
begin
han:=loadlibrary('mydll.dll');
if han=0 then showmessage('+Билиотека не найдена!')
else
begin
@f1:=getprocaddress(han,'f1');
@f2:=getprocaddress(han,'f2');
end;
end;
procedure TKurs.int1(a,b:real;n:integer;var ss:real);
var i1,i2,i:integer;h,s,s1,x1,s2,x2,yn,x:real;
begin
i:=1;
s1:=0;
y0:=INT(a);
h:=(b-a)/n;
repeat
x1:=a+i*h;
s1:=s1+INT(x1);
i:=i+2;
until i>n-1;
i1:=2;
s2:=0;
yn:=INT(b);
repeat
x2:=a+i1*h;
s2:=s2+INT(x2);
i1:=i1+2;
until i1>n-2;
yn:=a-n*h;
s:=(h/3)*(y0+4*s1+2*s2+yn);
ss:=s;
end;
procedure TKurs.int2(a,b:real;n:integer;var ss:real);
var i,j:integer;k:real;
begin
Form5.StringGrid1.Cells[0,0]:='I';
Form5.StringGrid1.Cells[1,0]:='Xi';
form5.StringGrid1.Cells[2,0]:='SQR(Xi)';
Form5.StringGrid1.Cells[3,0]:='(0.5*sqr(Xi)+1.5))';
Form5.StringGrid1.Cells[4,0]:='y0..yn';
Form5.StringGrid1.Cells[5,0]:='y1..yn';
s:=0;
h:=(b-a)/n;
Form5.Label2.Caption:=floattostr(h);
Form5.StringGrid1.RowCount:=n+3;
for i:=0 to n do begin
s:=s+iNT(a+i*h);
j:=0;
Form5.StringGrid1.Cells[j,i+1]:=intToStr(i);
j:=1;
Form5.StringGrid1.Cells[j,i+1]:=FloatToStrF((a+i*h),ffNumber,4,4);
j:=2;
Form5.StringGrid1.Cells[j,i+1]:=FloatToStrF(sqr(a+i*h),ffNumber,4,4);
j:=3;
form5.StringGrid1.Cells[j,i+1]:=FloatToStrF(0.5*sqr(a+i*h)+1.5,ffNumber,4,4);
j:=5;
Form5.StringGrid1.Cells[j,i+2]:=FloatToStrF(int(a+(i+1)*h),ffNumber,4,4);
end;
Form5.Show;
Form5.StringGrid1.Cells[0,n+2]:='Сумма';
Form5.StringGrid1.Cells[5,n+2]:=FloatToStrF(s-(int(a+(n)*h)+int(a+0*h)),ffNumber,4,4);
Form5.StringGrid1.Cells[4,1]:=FloatToStrF(int(a+0*h),ffNumber,4,4);
Form5.StringGrid1.Cells[4,n+1]:=FloatToStrF(int(a+(n)*h),ffNumber,4,4);
Form5.StringGrid1.Cells[4,n+2]:=FloatToStrF(int(a+(n)*h)+int(a+0*h),ffNumber,4,4);
s:=((INT(a)+INT(b))/2+s)*h;
ss:=s;
end;
Методика визуализации
Визуализация полученных значений при решении интеграла в зависимости от значений нижней границы при фиксированных значениях верхней границы определенного интеграла была получена с помощью стандартного компонента визуализации графических данных, а также с помощью класса TCanvas его свойств и методов которые описаны ниже.
Свойство | Описание |
Font | Определяет шрифт, чтобы использовать его при записи текста на изображении |
Brush | Определяет цвет и образец использования холста для заполнения графических форм и фонов |
Pen | Определяет вид пера для использования для рисования строк и структурирования форм |
Pixels | Определяет цвет области пикселов в пределах потока ClipRect. |
Метод | Описание |
Draw | Выполняет графический объект указанным параметром Graphic на холсте в местоположении, заданном координатами (X, Y). |
FillRect | Заполняет указанный прямоугольник на холсте, используя текущую кисть. |
LineTo | Тянет(рисует) строку на холсте от PenPos, к координатам указанных X и Y, и устанавливает перьевую позицию в (X, Y). |
MoveTo | Изменяет позицию текущего рисунка к координатам (X, Y). |
procedure TKurs.BitgrafClick(Sender: TObject);
var
x,ymin,ymax,hx1,hx,hy,xn,xk,mx,sx,my,sy,yy,xx:real;i,X1,Y1,Y2,x3,xa,ya,xb,yb:integer;
begin
if Timer1.Enabled=false then
Timer1.Enabled:=true;
Kurs.Imgraf.Canvas.FillRect(rect(0,0,620,370));
xn:=strtofloat(Edzn1.text);
xk:=StrTofloat(Edzn2.Text);
n:=strtoint(Edit3.Text);
x:=xn;ymax:=-1e30;ymin:=1e30;
while x<=xk do
begin
if RadioButton1.Checked then
int:=f1;
if RadioButton2.Checked then
int:=f2;
int1(x,xk,n,ss);
if ss>ymax then ymax:=ss;
if ss<ymin then ymin:=ss;
x:=x+0.01;
end;
x:=xn;
int1(x,xk,n,ss);
x1:=round(mx*x+sx);
y1:=round(my*x+sy);
repeat
int1(x,xk,n,ss);
x2:=ROUND(mx*x+sx);
y2:=round(-my*ss+sy);
kurs.Imgraf.Canvas.Pen.Color:=ColorDialog2.color;
kurs.Imgraf.Canvas.Brush.Color:=clwhite;
kurs.Imgraf.Canvas.MoveTo(x1,y1);
kurs.Imgraf.Canvas.LineTo(x2,y2);
x1:=x2;y1:=y2;
k:=true;
kurs.Imgraf.Canvas.Pen.Color:=clred;
kurs.Imgraf.Canvas.Pen.Width:=2;
hx1:=1;
hx:=(xk-xn)/10;
xa:=0;ya:=0;xb:=450;yb:=310;
mx:=(xb-xa)/(xk-xn);
my:=(yb-ya)/(ymax-ymin);
sy:=ya+my*ymax;sx:=xa-mx*xn;
kurs.Imgraf.Canvas.MoveTo(xb,yb);
kurs.Imgraf.Canvas.LineTo(xa,yb);
x:=x+0.01;
until x>xk;
i:=3;
xx:=xn;
//вертикальные состовляющие
repeat
kurs.Imgraf.Canvas.MoveTo(i,ya);
kurs.Imgraf.Canvas.LineTo(i,yb);
kurs.Imgraf.Canvas.TextOut(i,yb+5,FloatToStr(xx));
inc(i,Round((Imgraf.Width)/10));
xx:=xx+hx;
until i>Imgraf.Width;
//горизонтальные состовляющие
i:=Imgraf.Height-50;
repeat
yy:=(sy-i)/my;
kurs.Imgraf.Canvas.MoveTo(0,i);
kurs.Imgraf.Canvas.LineTo(Imgraf.Width,i);
kurs.Imgraf.Canvas.TextOut(0,i-5,FloatToStrF(yy,ffNumber,4,2));
i:=i-round(hy);
dec(i,Round((Imgraf.Height)/8));
until i<0 ;
2020-02-04 | 206 | Обсуждений (0) |
5.00
из
|
Обсуждение в статье: Функционально-структурная схема |
Обсуждений еще не было, будьте первым... ↓↓↓ |
Почему 1285321 студент выбрали МегаОбучалку...
Система поиска информации
Мобильная версия сайта
Удобная навигация
Нет шокирующей рекламы