Текущий архив: 2006.07.16;
Скачать: CL | DM;
ВнизЯ не могу понять, почему Делфи не считает куски формулы? Найти похожие ветки
← →
b.o.n.d.007 © (2006-06-24 16:40) [0]Я начинающий пользователь Делфи и плохо её знаю, поетому прошу знающих и хорошо владеющих этой программой мне помочь.
Проблема в следующем: Я написал формулу, Делфи проверил её на правельность записи, ни на что не ругается, но, она не считает отдельные куски этой ф-лы, а конкретно перемножение и, ни как не учитывает перемножаемые числа. НАПРИМЕР: y=(a+b-c*d*e*f)/(g+h*t) .
Он же мне её считает, как: y=(a+b)/g .
Помогите. Что мне делать и почему это происходит?
Заранее спасибо.
← →
Шпиён (2006-06-24 16:50) [1]Код в студию. Чудес на свете не бывает.
← →
b.o.n.d.007 © (2006-06-24 17:01) [2]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.
← →
Desdechado © (2006-06-24 17:17) [3]Нa какой из кусков кода смотреть?
Там, по крайней мере, 2 места отдаленно напоминающих формулу, при этом ужасно замусоренных преобразованиями со строками.
← →
b.o.n.d.007 © (2006-06-24 17:27) [4]Что не считает - выделено.
Сперва была такая запись:
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)));
← →
TUser © (2006-06-24 18:04) [5]Должно работать. А как ты узнал, что не считает?
← →
b.o.n.d.007 © (2006-06-24 18:52) [6]Я поменял некоторые цыфры на форме, а ответ не меняется. Выяснил какие цыфры влияют на ответ, а какие нет.
← →
Desdechado © (2006-06-24 19:04) [7]
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 19:09) [8]
> 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 20:42) [9]Хотя, знаете, Делфи всётаки плохо считает формулу. Я переписал её на листик, подставил всё тоже самое, что и в прогу, ответ получился СоВЕРШЕННО РАЗНЫЙ. Мой ответ на листике (он же правельный) получается положительный, а программа считает в "минус", причём другое число...
Я уже не знаю что делать.
Помогите снова.
← →
b.o.n.d.007 © (2006-06-24 20:45) [10]Упростил формулу до невозможности:
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)));
← →
Desdechado © (2006-06-24 20:52) [11]Ты мне поясни, зачем ты все-таки для одинаковых значений заводишь по несколько переменных?
И теперь "упрощенная до невозможности" выглядит СОВСЕМ по-другому. Где правда?
← →
b.o.n.d.007 © (2006-06-24 21:08) [12]Да согласен, есть повторения. Объясняю, просто я расписывал отдельные части формулы и присваивал им разные буквы, не заметил что их колличество можно сократить. Каюсь.
Но это ни чего не меняет, она всё равно криво считает.
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)));
← →
Плохиш © (2006-06-24 21:17) [13]
> b.o.n.d.007 © (24.06.06 20:42) [9]
> Хотя, знаете, Делфи всётаки плохо считает формулу.
Я тебе большую тайну открою. Делфи вообще формулы не считает, делфи умеет только выполнять команды, которые программист в программе написал. Так что ищи ошибки в своём коде.
← →
b.o.n.d.007 © (2006-06-24 21:32) [14]А где именно искать ошибку? В коде формулы?, так я его выложил.
Формула правельная, я её проверял не один раз.
Погрешность в подсчёте (-20000), т.е. Если у меня получилось (3378,3784), то у Делфи получается (-23378,3784).
Где мне тогда искать ошибку???
← →
Loginov Dmitry © (2006-06-24 21:45) [15]> Если у меня получилось (3378,3784), то у Делфи получается
> (-23378,3784).
Ну значит, ты считаешь по другой формуле. Дельфя такую пограшность дать не может...
← →
Virgo_Style © (2006-06-24 21:47) [16]правельная
Не жди правильного ответа от правельной формулы
b.o.n.d.007 © (24.06.06 21:32) [14]
Где мне тогда искать ошибку???
> в своём коде.
← →
b.o.n.d.007 © (2006-06-25 00:29) [17]
> Ну значит, ты считаешь по другой формуле. Дельфя такую пограшность
> дать не может...
Как не может, если выдала.
Модет быть дело в описании переменных (Real, integer, и т.д.)?
← →
Джо © (2006-06-25 04:19) [18]> [17] b.o.n.d.007 © (25.06.06 00:29)
> Модет быть дело в описании переменных (Real, integer, и
> т.д.)?
Может.
Совет. А возьми-ка и сделай вводимые значения константами (const) с теми же типами данных, что и должны быть по условию, без всяких полей ввода и т.п. Запиши с ними формулу, убедись, что считает правильно (или неправильно), тогда и начинай искать ошибку, поочередну заменяя константы на что-то другое, зависящее от ввода. В таком духе. Ну кто с этой кучей плохого кода разбираться станет, а?
Да, и судя по формулам, ставь сразу всем константам (переменным) тип Double.
← →
Palladin © (2006-06-25 09:05) [19]Еще не плохо бы выложить исходные данные и ответ который получился на бумаге. :)
← →
b.o.n.d.007 © (2006-06-25 17:19) [20]Я забил все значения в константы, считает по-прежнему не правельно.
Видать действительно ошибка в записи формулы...
Напишите, как правельно писать матеметические знаки (сложить, отнять, умнжить, поделить и т.д.) с примерами записи (простыми и сложными) формул.
← →
b.o.n.d.007 © (2006-06-25 17:22) [21]Вот исходные данные:
A=100000;
B=10000;
C=0.13;
D=20;
E=10000;
F=1;
G=1000;
K=10;
Вот формула, куда я их подставлял:
formula3.Text:=FloatToStr((A+B+((1-C)*D*E*F)-G)/(K-((1-C)*D)));
← →
sniknik © (2006-06-25 17:23) [22]а теорему "почему 1 + 1 = 2" не доказать?
← →
sniknik © (2006-06-25 17:26) [23]> Вот формула, куда я их подставлял:
а чего хотел от нее? что должна считать то?
как искать ошибку в логике не зная логики по которой она сделана, видя только конечную формулу? это к телепатам.
← →
b.o.n.d.007 © (2006-06-25 17:27) [24]Вот так формула более понятно:
A+B+(1-C)*D*E*F-G
formula3.text:=FloatToStr(-----------------------) ;
K-(1-C)*D
← →
Palladin © (2006-06-25 17:27) [25]ну а ответ то где? который ты на бумаге получил
← →
b.o.n.d.007 © (2006-06-25 17:33) [26]Ответ мой: 18243
Ответ проги: -38243
← →
b.o.n.d.007 © (2006-06-25 17:38) [27]ка у делфи вообще получился отрицательный товет при делении бвух положительных чисел?!
← →
sniknik © (2006-06-25 17:47) [28]> Ответ мой: 18243
> Ответ проги: -38243
ну что можно сказать... учись считать в столбикprocedure TForm1.Button1Click(Sender: TObject);
const
A=100000;
B=10000;
C=0.13;
D=20;
E=10000;
F=1;
G=1000;
K=10;
begin
Label1.Caption:= FloatToStr( A+B+(1-C)*D*E*F-G ); //верх
Label2.Caption:= FloatToStr( K-(1-C)*D ); //низ
Label3.Caption:= FloatToStr( (A+B+(1-C)*D*E*F-G) / (K-(1-C)*D) ); //общее
end;
вверху положительное делится на отрицательное (внизу), ну никак общее положительным не будет.
> ка у делфи вообще получился отрицательный товет при делении бвух положительных чисел?!
это во второй класс, там учат правильно раскрывать скобки...
← →
Palladin © (2006-06-25 17:55) [29]чтд
← →
b.o.n.d.007 © (2006-06-25 18:05) [30]Объясняю знаменатель, как он должен делаться:
1) сперва от "1" отнимоется "C" , т.е. 1-C
2) полученный результат умножается на "D" , т.е. (1-C)*D
3) далее, от "K" отнимается сосчитанное ранее в п.2 , т.е. K-(1-C)*D
Вот так оно должно считаться, и уж тат ответ положительный!!!
Как тогда его заставить не раскрывать скобки, они ведь для этого и стоят???
← →
_silver © (2006-06-25 18:11) [31]b.o.n.d.007 © (25.06.06 18:05) [30]
1-0.13=0.87
0.87*20=17.4
10-17.4= -7.4
b.o.n.d.007 © (25.06.06 18:05) [30]
и уж тат ответ положительный!!!
Где?
← →
sniknik © (2006-06-25 18:13) [32]const
A=100000;
B=10000;
C=0.13;
D=20;
E=10000;
F=1;
G=1000;
K=10;
1-C = 1-0.13 = 0.87
(1-C)*D = 0.87*20 = 17.4
K-(1-C)*D = 10 - 17.4 = -7.4
> Как тогда его заставить не раскрывать скобки, они ведь для этого и стоят???
заставь себя, назад за парту и учиться, учится и учиться.
← →
b.o.n.d.007 © (2006-06-25 18:20) [33]Спасибо что вправили мне мозги!!!
Я считал не "1-С" а сразу "С"
← →
Palladin © (2006-06-25 18:29) [34]А вдруг они это еще не проходили... :))
← →
Palladin © (2006-06-25 18:33) [35]
> b.o.n.d.007 © (25.06.06 18:20) [33]
и все таки заставь себя доверять результатам программных вычислений... уже давно не те времена когда можно было почувствовать себя первоиспытателем и найти в компиляторе ошибку в интерпретации формул...
← →
b.o.n.d.007 © (2006-06-25 18:47) [36]может подскажете, как записать "модуль" (как это в формуле будет выглядить)?
← →
Жуков Олег (2006-06-25 18:58) [37]
> может подскажете, как записать "модуль" (как это в формуле
> будет выглядить)?uses
Math;
y = Abs(x);
← →
b.o.n.d.007 © (2006-06-25 20:05) [38]Если здесь ещё кто-то есть обратите внимание на другую мою тему.
Страницы: 1 вся ветка
Текущий архив: 2006.07.16;
Скачать: CL | DM;
Память: 0.56 MB
Время: 0.012 c