![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Я не могу понять, почему Делфи не считает куски формулы? [D7, XP]
b.o.n.d.007 © (2006-06-24 16:40:00)Я начинающий пользователь Делфи и плохо её знаю, поетому прошу знающих и хорошо владеющих этой программой мне помочь.
Проблема в следующем: Я написал формулу, Делфи проверил её на правельность записи, ни на что не ругается, но, она не считает отдельные куски этой ф-лы, а конкретно перемножение и, ни как не учитывает перемножаемые числа. НАПРИМЕР: y=(a+b-c*d*e*f)/(g+h*t) .
Он же мне её считает, как: y=(a+b)/g .
Помогите. Что мне делать и почему это происходит?
Заранее спасибо.
Джо (2006-06-25 04:19:00) [21]> [17] b.o.n.d.007 © (25.06.06 00:29)
> Модет быть дело в описании переменных (Real, integer, и
> т.д.)?
Может.
Совет. А возьми-ка и сделай вводимые значения константами (const) с теми же типами данных, что и должны быть по условию, без всяких полей ввода и т.п. Запиши с ними формулу, убедись, что считает правильно (или неправильно), тогда и начинай искать ошибку, поочередну заменяя константы на что-то другое, зависящее от ввода. В таком духе. Ну кто с этой кучей плохого кода разбираться станет, а?
Да, и судя по формулам, ставь сразу всем константам (переменным) тип Double.
b.o.n.d.007 (2006-06-25 00:29:00) [22]
> Ну значит, ты считаешь по другой формуле. Дельфя такую пограшность
> дать не может...
Как не может, если выдала.
Модет быть дело в описании переменных (Real, integer, и т.д.)?
Virgo_Style (2006-06-24 21:47:00) [23]правельная
Не жди правильного ответа от правельной формулы
b.o.n.d.007 © (24.06.06 21:32) [14]
Где мне тогда искать ошибку???
> в своём коде.
Loginov Dmitry (2006-06-24 21:45:00) [24]> Если у меня получилось (3378,3784), то у Делфи получается
> (-23378,3784).
Ну значит, ты считаешь по другой формуле. Дельфя такую пограшность дать не может...
b.o.n.d.007 (2006-06-24 21:32:00) [25]А где именно искать ошибку? В коде формулы?, так я его выложил.
Формула правельная, я её проверял не один раз.
Погрешность в подсчёте (-20000), т.е. Если у меня получилось (3378,3784), то у Делфи получается (-23378,3784).
Где мне тогда искать ошибку???
Плохиш (2006-06-24 21:17:00) [26]
> b.o.n.d.007 © (24.06.06 20:42) [9]
> Хотя, знаете, Делфи всётаки плохо считает формулу.
Я тебе большую тайну открою. Делфи вообще формулы не считает, делфи умеет только выполнять команды, которые программист в программе написал. Так что ищи ошибки в своём коде.
b.o.n.d.007 (2006-06-24 21:08:00) [27]Да согласен, есть повторения. Объясняю, просто я расписывал отдельные части формулы и присваивал им разные буквы, не заметил что их колличество можно сократить. Каюсь.
Но это ни чего не меняет, она всё равно криво считает.
A:=StrToFloat(RezFin.text);
B:=StrToFloat(Kredit.text);
C:=StrToFloat(betta.text)/100;
D:=StrToFloat(PriseEdProd.text);
E:=StrToFloat(V_Prod.Text);
F:=StrToFloat(A_Prod.Text)/100;
G:=StrToFloat(ZatrPost.text);
K:=StrToFloat(ZatrEdProd.text);
formula3.Text:=FloatToStr((A+B-G+((1-C)*D*E*F))/(K-((1-C)*D)));
Desdechado (2006-06-24 20:52:00) [28]Ты мне поясни, зачем ты все-таки для одинаковых значений заводишь по несколько переменных?
И теперь "упрощенная до невозможности" выглядит СОВСЕМ по-другому. Где правда?
b.o.n.d.007 (2006-06-24 20:45:00) [29]Упростил формулу до невозможности:
A:=StrToFloat(RezFin.text);
B:=StrToFloat(Kredit.text);
C:=StrToFloat(betta.text)/100;
D:=StrToFloat(PriseEdProd.text);
E:=StrToFloat(V_Prod.Text);
F:=StrToFloat(A_Prod.Text)/100;
G:=StrToFloat(ZatrPost.text);
H:=StrToFloat(ZatrEdProd.text);
K:=StrToFloat(betta.text)/100;
L:=StrToFloat(PriseEdProd.text);
formula3.Text:=FloatToStr((A+B-G+((1-C)*D*E*F))/(H-((1-K)*L)));
b.o.n.d.007 (2006-06-24 20:42:00) [30]Хотя, знаете, Делфи всётаки плохо считает формулу. Я переписал её на листик, подставил всё тоже самое, что и в прогу, ответ получился СоВЕРШЕННО РАЗНЫЙ. Мой ответ на листике (он же правельный) получается положительный, а программа считает в "минус", причём другое число...
Я уже не знаю что делать.
Помогите снова.
b.o.n.d.007 (2006-06-24 19:09:00) [31]
> A:=(1-((StrToFloat(betta.text))/100));
> E:=(1-((StrToFloat(betta.text))/100));
> B:=StrToFloat(PriseEdProd.text);
> F:=StrToFloat(PriseEdProd.text);
>
> Это так надо, что A=Е, а B=F ?
Да это так и надо.
Я обнаружил ошибку, просто нолик закрался в решение, он-то и обнулял умножаемые числа. К тому же сама формула кривая.
Спасибо и ИЗВЕНИТЕ за беспокойство.
Desdechado (2006-06-24 19:04:00) [32]
A:=(1-((StrToFloat(betta.text))/100));
E:=(1-((StrToFloat(betta.text))/100));
B:=StrToFloat(PriseEdProd.text);
F:=StrToFloat(PriseEdProd.text);
Это так надо, что A=Е, а B=F ?
b.o.n.d.007 (2006-06-24 18:52:00) [33]Я поменял некоторые цыфры на форме, а ответ не меняется. Выяснил какие цыфры влияют на ответ, а какие нет.
TUser (2006-06-24 18:04:00) [34]Должно работать. А как ты узнал, что не считает?
b.o.n.d.007 (2006-06-24 17:27:00) [35]Что не считает - выделено.
Сперва была такая запись:
formula3.Text:=FloatToStr((StrToFloat(RezFin.text)+StrToFloat(Kredit.text)+
(1-((StrToFloat(betta.text))/100))*(StrToFloat(PriseEdProd.text)*(StrToFloat(V_Prod.Text))*((StrToFloat(A_Pro d.Text))/100))-
StrToFloat(ZatrPost.text))/
(StrToFloat(ZatrEdProd.text )-(1-(StrToFloat(betta.text)/100))*
StrToFloat(PriseEdProd.text)))
Потом я записал её иначе:
A:=(1-((StrToFloat(betta.text))/100));
B:=StrToFloat(PriseEdProd.text);
C:=StrToFloat(V_Prod.Text);
D:=(StrToFloat(A_Prod.Text))/100;
E:=(1-((StrToFloat(betta.text))/100));
F:=StrToFloat(PriseEdProd.text);
formula3.Text:=FloatToStr((StrToFloat(RezFin.text)+StrToFloat(Kredit.text)+ (A*B*C*D)-StrToFloat(ZatrPost.text))/(StrToFloat(ZatrEdProd.text )-(E*F)));
Desdechado (2006-06-24 17:17:00) [36]Нa какой из кусков кода смотреть?
Там, по крайней мере, 2 места отдаленно напоминающих формулу, при этом ужасно замусоренных преобразованиями со строками.
b.o.n.d.007 (2006-06-24 17:01:00) [37]unit VMI_i_PR;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Menus, StdCtrls, TeEngine, TeeFunci, Series, ExtCtrls, TeeProcs,
Chart;
Const
n=4;
type
Tkursovik = class(TForm)
GroupBox1: TGroupBox;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
RezFin: TEdit;
Kredit: TEdit;
ZatrPost: TEdit;
betta: TEdit;
GroupBox2: TGroupBox;
Label5: TLabel;
Label6: TLabel;
Label7: TLabel;
Label8: TLabel;
Label9: TLabel;
Name: TEdit;
PriseEdProd: TEdit;
ZatrEdProd: TEdit;
V_Prod: TEdit;
A_Prod: TEdit;
Button1: TButton;
Button2: TButton;
Button3: TButton;
Button4: TButton;
formula3: TEdit;
TChart: TChart;
Series1: TLineSeries;
TeeFunction1: TAddTeeFunction;
Series2: TLineSeries;
TeeFunction2: TAddTeeFunction;
MainMenu1: TMainMenu;
N1: TMenuItem;
N2: TMenuItem;
N8: TMenuItem;
N3: TMenuItem;
N4: TMenuItem;
N5: TMenuItem;
N6: TMenuItem;
N7: TMenuItem;
GroupBox3: TGroupBox;
GroupBox4: TGroupBox;
formula5: TEdit;
procedure N2Click(Sender: TObject);
procedure N3Click(Sender: TObject);
procedure N7Click(Sender: TObject);
procedure N4Click(Sender: TObject);
procedure N9Click(Sender: TObject);
procedure N13Click(Sender: TObject);
procedure N11Click(Sender: TObject);
procedure N17Click(Sender: TObject);
procedure N5Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
procedure N6Click(Sender: TObject);
procedure formula3Change(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
TPredpr=class
RezFin: real;
Kredit: real;
ZatrPost: real;
betta: real;
end;
TProduct=class
Name: string[15];
ZatrEdProd: real;
PriseEdProd: real;
V_Prod: array[1..n] of real;
A_Prod: array[0..n] of real;
end;
var
kursovik: Tkursovik;
m,i: integer;
A,B,C,D,E,F: Real;
implementation
uses Unit1, Unit2;
{$R *.dfm}
procedure Tkursovik.N2Click(Sender: TObject);
begin
AboutBox.ShowModal;
end;
procedure Tkursovik.N3Click(Sender: TObject);
begin
AboutBox1.ShowModal;
end;
procedure Tkursovik.N7Click(Sender: TObject);
begin
Close
end;
procedure Tkursovik.N4Click(Sender: TObject);
begin
GroupBox1.Visible:= True;
GroupBox2.Visible:= True;
GroupBox3.Visible:= False;
GroupBox4.Visible:= False;
TChart.Visible:=False;
{Form3.ShowModal;}
end;
{Function Dohod(n,m:integer;Product:tProduct;betta:Real):Real;
Begin
for i:=1 to m do
Dohod:=(Product.V_Prod[n-i])*(Product.A_Prod[i])*(1-(betta/100))*Product.PriseEdProd
End;}
procedure Tkursovik.N5Click(Sender: TObject);
begin
GroupBox1.Visible:= False;
GroupBox2.Visible:= False;
GroupBox3.Visible:= True;
GroupBox4.Visible:= True;
TChart.Visible:=False;
{formula3.Text:=FloatToStr((StrToFloat(RezFin.text)+
StrToFloat(Kredit.text)+
(StrToFloat(V_Prod.Text[n-i])*(StrToFloat(A_Prod.Text[i])/100)*
(1-StrToFloat(betta.Text)/100)*StrToFloat(PriseEdProd.Text))-
StrToFloat(ZatrPost.text))/
(StrToFloat(ZatrEdProd.text)-(1-(StrToFloat(betta.text)/100))*
StrToFloat(PriseEdProd.text)))}
A:=(1-((StrToFloat(betta.text))/100)); {..+..+(a*b*c*d)/..-(E*F)}
B:=StrToFloat(PriseEdProd.text);
C:=StrToFloat(V_Prod.Text);
D:=(StrToFloat(A_Prod.Text))/100;
E:=(1-((StrToFloat(betta.text))/100));
F:=StrToFloat(PriseEdProd.text);
formula3.Text:=FloatToStr((StrToFloat(RezFin.text)+StrToFloat(Kredit.text)+(A*B*C*D)-StrToFloat(ZatrPost.text))/(StrToFloat(ZatrEdProd.text)-(E*F)));
end;
procedure Tkursovik.N6Click(Sender: TObject);
begin
GroupBox1.Visible:= False;
GroupBox2.Visible:= False;
GroupBox3.Visible:= False;
GroupBox4.Visible:= False;
TChart.Visible:=True;
end;
procedure Tkursovik.N13Click(Sender: TObject);
begin
AboutBox.ShowModal;
end;
procedure Tkursovik.N11Click(Sender: TObject);
begin
AboutBox1.ShowModal;
end;
procedure Tkursovik.N9Click(Sender: TObject);
begin
close
end;
procedure Tkursovik.N17Click(Sender: TObject);
begin
close
end;
procedure Tkursovik.Button4Click(Sender: TObject);
begin
close
end;
procedure Tkursovik.formula3Change(Sender: TObject);
BEGIN
{formula3.Text:=FloatToStr((StrToFloat(RezFin.text)+StrToFloat(Kredit.text)+
(1-((StrToFloat(betta.text))/100))*(StrToFloat(PriseEdProd.text)*(StrToFloat(V_Prod.Text))*((StrToFloat(A_Pro d.Text))/100))-
StrToFloat(ZatrPost.text))/
(StrToFloat(ZatrEdProd.text)-(1-(StrToFloat(betta.text)/100))*
StrToFloat(PriseEdProd.text)))}
A:=(1-((StrToFloat(betta.text))/100)); {..+..+(a*b*c*d)/..-(E*F)}
B:=StrToFloat(PriseEdProd.text);
C:=StrToFloat(V_Prod.Text);
D:=(StrToFloat(A_Prod.Text))/100;
E:=(1-((StrToFloat(betta.text))/100));
F:=StrToFloat(PriseEdProd.text);
formula3.Text:=FloatToStr((StrToFloat(RezFin.text)+StrToFloat(Kredit.text)+(A*B*C*D)-StrToFloat(ZatrPost.text))/(StrToFloat(ZatrEdProd.text)-(E*F)));
end;
end.
Шпиён (2006-06-24 16:50:00) [38]Код в студию. Чудес на свете не бывает.