![]() |
|
|
#1
|
|||
|
|||
|
Вечер добрый ребят, помогите пожалуйста подключить модуль функции чтобы работали функции S(x), Y(x) сижу мучаюсь не знаю как подключить и как прописать одно в другое...
Код программы: Код:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls;
type
TForm1 = class(TForm)
Label1: TLabel;
Edit1: TEdit;
Label2: TLabel;
Edit2: TEdit;
Label3: TLabel;
Edit3: TEdit;
Label4: TLabel;
Edit4: TEdit;
Label5: TLabel;
Button1: TButton;
RadioGroup1: TRadioGroup;
Memo1: TMemo;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
const
xn = 0.1;
xk = 0.5;
h = 0.1;
e = 0.0001;
var
x, y, t, s: real;
n: Integer;
begin
Memo1.Clear;
Memo1.Lines.Add('Результаты ст. гр. 5В011100 Гулов Е.В.');
Memo1.Lines.Add('xn=0.1');
Memo1.Lines.Add('xk=0.5');
Memo1.Lines.Add('h=0.1');
Memo1.Lines.Add('e=0.0001');
x := xn;
while x <= xk do
begin
n := 0;
t := x;
s := t;
while Abs(t) / (2 * n + 1) > e do
begin
n := n + 1;
t := -t * x * x;
s := s + t / (2 * n + 1);
end;
y := arctan(x);
Memo1.Lines.Add('При х=' + formatfloat('0.0', x) + ' сумма=' + formatfloat
('0.0000', s) + ' y=' + formatfloat('0.0000', y) + ' N=' + inttostr
(n + 1));
x := x + h;
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
memo1.Clear;
RadioGroup1.ItemIndex:=0;
end;
end.код модуля Код:
unit Unit2;
interface
uses StdCtrls, SysUtils;
Type
fun = function(x : extended):extended; // Объявление типа функция
{Расчет таблицы функции f (табуляция функции)}
procedure Tabl(f:fun;xn,xk:extended; m: word; Memo1 : TMemo);
implementation
procedure Tabl;
var x,y,h: extended;
i : integer;
begin
x:=xn; h:=(xn-xk)/m;
for i:=1 to m+1 do begin
y:=f(x);
Mem1.Lines.Add(' x='+FloatToStrf(x,fffixed,8,3)+
' y='+FloatToStrf(y,fffixed,8,3));
x:=x+h;
end;
end;
end. |
|
#2
|
|||
|
|||
|
не вижу кода функций S(x) и Y(x)
|
|
#3
|
|||
|
|||
|
Куда и как прописать их!?
|
|
#4
|
||||
|
||||
|
Код:
unit Unit1;
...
{$R *.dfm}
uses
Unit2;
... |
|
#5
|
|||
|
|||
|
как прописать функции
Безымянный.jpg Последний раз редактировалось Tupiy, 14.11.2016 в 12:41. |
|
#6
|
|||
|
|||
|
как прописать его их?*
Безымянный.png |
|
#7
|
||||
|
||||
|
Примерно так, но поскольку кроме объявы нет самого тела функции типа fun, работать полностью (в положении Y(x)) это не будет
|
|
#8
|
|||
|
|||
|
а можешь кодом просто написать?
|
|
#9
|
||||
|
||||
|
Код:
...
uses Unit2;
procedure TForm1.Button1Click(Sender: TObject);
var
xn, xk, h, e, x, y, t, s: real;
n: Integer;
begin
xn:= StrToFloat(Edit1.Text);// 0.1;
xk:= StrToFloat(Edit2.Text);//0.5;
h := StrToFloat(Edit3.Text);//0.1;
e := StrToFloat(Edit4.Text);//0.0001;
Memo1.Clear;
Memo1.Lines.Add('Результаты ст. гр. 5В011100 Гулов Е.В.');
Memo1.Lines.Add('xn='+ Edit1.Text);
Memo1.Lines.Add('xk='+ Edit2.Text);
Memo1.Lines.Add('h=' + Edit3.Text);
Memo1.Lines.Add('e=' + Edit4.Text);
if RadioGroup1.ItemIndex = 0 then
begin
x := xn;
while x <= xk do
begin
n := 0;
t := x;
s := t;
while Abs(t) / (2 * n + 1) > e do
begin
n := n + 1;
t := -t * x * x;
s := s + t / (2 * n + 1);
end;
y := arctan(x);
Memo1.Lines.Add('При х=' + formatfloat('0.0', x) + ' сумма=' + formatfloat
('0.0000', s) + ' y=' + formatfloat('0.0000', y) + ' N=' + inttostr
(n + 1));
x := x + h;
end;
end else
Tabl(nil {должна быть типа fun} , xn, xk, 10 {для примера}, Memo1);
end; |
|
#10
|
|||
|
|||
|
эт значит не то?
Код:
procedure Tabl(f:fun;xn,xk:extended; m: word; Memo1 : TMemo);
implementation
procedure Tabl;
var x,y,h: extended;
i : integer;
begin
x:=xn; h:=(xn-xk)/m;
for i:=1 to m+1 do begin
y:=f(x);
Mem1.Lines.Add(' x='+FloatToStrf(x,fffixed,8,3)+
' y='+FloatToStrf(y,fffixed,8,3));
x:=x+h;
end; |
|
#11
|
||||
|
||||
|
Как раз то, это нужно для режима в положении радиоптисы на Y(x), но необходим для этой процедуры внятный первый параметр (f:fun), объявление его есть
Код:
Type
fun = function(x : extended):extended; // Объявление типа функция |
|
#12
|
|||
|
|||
|
пример подобный вот
Код:
Тексты модуля
Листинг 5.1
unit matfu;
interface
uses StdCtrls, SysUtils;
Type
fun = function(x : extended):extended; // Объявление типа функция
{Расчет таблицы функции f (табуляция функции)}
procedure Tabl(f:fun;xn,xk:extended; m: word; Mem1 : TMemo);
implementation
procedure Tabl;
var x,y,h: extended;
i : integer;
begin
x:=xn; h:=(xn-xk)/m;
for i:=1 to m+1 do begin
y:=f(x);
Mem1.Lines.Add(' x='+FloatToStrf(x,fffixed,8,3)+
' y='+FloatToStrf(y,fffixed,8,3));
x:=x+h;
end;
end;
end. // Конец модуля matfu
// программа
unit Unit6;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Buttons, ExtCtrls, Matfu;
type
TForm1 = class(TForm)
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
Edit1: TEdit;
Edit2: TEdit;
Edit3: TEdit;
Edit4: TEdit;
RadioGroup1: TRadioGroup;
Memo1: TMemo;
BitBtn1: TBitBtn;
BitBtn2: TBitBtn;
procedure FormCreate(Sender: TObject);
procedure BitBtn1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
xn,xk,e : extended;
m : word;
implementation
{$R *.dfm}
function sx(x:extended):extended;
var a,n,s : extended;
k : integer;
begin
k:=-1; a:=1; n:=0; s:=1;
try
while (abs(a) > e) do begin
n:=n+1;
a:=-a*x/n;
s:=s+a;
end;
Result:=s;
except
on EInvalidOp do
k:=MessageDlg('Неправильная операция с плавающей точкой. ’+
’ Продолжить вычисления?',mtError,[mbYes,mbNo],0);
on EOverFlow do
k:=MessageDlg('Переполнение при выполне-нии операции с’+
’ плавающей точкой! Продолжить вычисления?',mtError,[mbYes,mbNo],0);
else
k:=MessageDlg('Возникла неизвестная исключительная ситуация!’+
‘ Продолжить вычисления?',mtError,[mbYes,mbNo],0);
end;
case k of
mrYes : Result:=0;
mrNo : Halt(1);
end;
end;
function yx(x:extended):extended;
begin
Result:=exp(-x);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Memo1.Clear;
RadioGroup1.ItemIndex:=0;
Edit1.Text:='0';
Edit2.Text:='2';
Edit3.Text:='6';
Edit4.Text:='0,001';
end;
procedure TForm1.BitBtn1Click(Sender: TObject);
begin
Memo1.Clear;
Memo1.Lines.Add('Лаб. раб. №6 ст. гр. 552003 Иванова А.А.');
xn:=StrToFloat(Edit1.Text);
Memo1.Lines.Add(' xn='+FloatToStrF(xn,ffFixed,6,2));
xk:=StrToFloat(Edit2.Text);
Memo1.Lines.Add(' xk='+FloatToStrF(xk,ffFixed,6,2));
m:=StrToInt(Edit3.Text);
Memo1.Lines.Add(' h='+IntToStr(m));
e:=StrToFloat(Edit4.Text);
Memo1.Lines.Add(' e='+FloatToStrF(e,ffFixed,8,5));
case RadioGroup1.ItemIndex of
0 : begin
Memo1.Lines.Add('Расчет S(x)');
Tabl(sx,xn,xk,m,Memo1);
end;
1 : begin
Memo1.Lines.Add('Расчет Y(x)');
Tabl(yx,xn,xk,m,Memo1);
end;
end;
end;
end. там надо сделать S(x) Y(X) срс5.rar второй архив задание универа 5 работа если я как то не правильно объясняю, МУ-ЛР-АиОП_5В07030_ИС.rar Последний раз редактировалось Tupiy, 15.11.2016 в 11:55. |
|
#13
|
||||
|
||||
|
Вот и скармливайте вашей процедуре функции или sx() либо yx() в зависимости от выбора метки в RadioGroup1
|
|
#14
|
|||
|
|||
|
я понять не могу как, я какую-то ересть делаю которая по 100 ошибок выдаёт, поэтому я и обращаюсь к вам, за помощью..
|
|
#15
|
||||
|
||||
|
А чего понимать, ведь подключено уже всё, только осталось провести инициализацию переменной m, хотя бы принудительно как m : word = 1;
|