Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Я не могу понять, почему Делфи не считает куски формулы? [D7, XP]


Страницы:   1 2

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]

Код в студию. Чудес на свете  не бывает.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо