Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.58 MB
Время: 0.031 c
3-1147685034
Sorcerer
2006-05-15 13:23
2006.07.16
Использование ADO


11-1130302726
Vladimir Kladov
2005-10-26 08:58
2006.07.16
PRN и другие специальные "файлы" DOS


2-1151653268
fast2
2006-06-30 11:41
2006.07.16
Как вывести в Label содерживое ячейки 2-го столбца...


1-1149152229
Kolan
2006-06-01 12:57
2006.07.16
Как сделать объект управляющий другими потоком?


2-1151659349
D@Nger
2006-06-30 13:22
2006.07.16
Временное отключение DBGrid от DataSet