Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2006.07.16;
Скачать: [xml.tar.bz2];

Вниз

Я не могу понять, почему Делфи не считает куски формулы?   Найти похожие ветки 

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.56 MB
Время: 0.01 c
5-1135259011
sco
2005-12-22 16:43
2006.07.16
Package unit IconButton cannot appear in contains or uses claus


15-1150485086
X9
2006-06-16 23:11
2006.07.16
Гигабитная сеть


2-1151366523
fantasy
2006-06-27 04:02
2006.07.16
RaveReport


15-1150310876
ArtemESC
2006-06-14 22:47
2006.07.16
Поломка диска


15-1150125646
inri13666
2006-06-12 19:20
2006.07.16
Crtical or System Service





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский