Написание Формулы

Xatiko

New Member
05.03.2013
2
0
#1
Доброго времени суток!
Есть проблема при написании формулы. Приведу пример:

Для одного объекта:
(x1*z1)/(z1)
(y1*z1)/(z1)

Ed-это (х) Ed1-это (у) Ed2-это (z)

Код:
procedure TForm1.Button8Click(Sender: TObject);
begin
if form1.ComboBox1.ItemIndex=0 then
begin
label37.Caption:=Floattostr(StrToInt(Ed[1].text)*StrToInt(Ed2[1].text)/StrToInt(Ed2[1].text));
label38.Caption:=Floattostr(StrToInt(Ed1[1].text)*StrToInt(Ed2[1].text)/StrToInt(Ed2[1].text));
end
Для двух:
(x1*z1)+(x2*z2)/(z1+z2)
(y1*z1)+(y2*z2)/(z1+z2)

В этой же процедуре.
Код:
else
if form1.ComboBox1.ItemIndex=1 then
begin
label37.Caption:=Floattostr(((StrToInt(Ed[1].text)*StrToInt(Ed2[1].text))+((StrToInt(Ed[2].text)*StrToInt(Ed2[2].text)))/(StrToInt(Ed2[1].text)+StrToInt(Ed2[2].text))));
label38.Caption:=Floattostr(((StrToInt(Ed1[1].text)*StrToInt(Ed2[1].text))+((StrToInt(Ed1[2].text)*StrToInt(Ed2[2].text)))/(StrToInt(Ed2[1].text)+StrToInt(Ed2[2].text))));
end;
end;
Вопрос в том что, для одного работает, а для двух выводит огромные значения которых даже не вводили. А вообще надо хотя бы до 20. Но так как уже не работает для двух, смысла дальше нет двигаться.
Есть догадки, что не так расставленны скобки и компилятор выполняет не те арифмитические действия.
 

gpatron

Active Member
13.08.2009
26
0
36
Тирасполь
#2
Если Вам нужно именно такой порядок вычислений:
(x1*z1)+(x2*z2)/(z1+z2)
(y1*z1)+(y2*z2)/(z1+z2), то:

Код:
label37.Caption:=Floattostr((StrToInt(Ed[1].text)*StrToInt(Ed2[1].text))+(StrToInt(Ed[2].text)*StrToInt(Ed2[2].text))/(StrToInt(Ed2[1].text)+StrToInt(Ed2[2].text)));
label38.Caption:=Floattostr((StrToInt(Ed1[1].text)*StrToInt(Ed2[1].text))+(StrToInt(Ed1[2].text)*StrToInt(Ed2[2].text))/(StrToInt(Ed2[1].text)+StrToInt(Ed2[2].text)));
А если другой порядок вычислений:
((x1*z1)+(x2*z2))/(z1+z2)
((y1*z1)+(y2*z2))/(z1+z2), то:

Код:
label37.Caption:=Floattostr(((StrToInt(Ed[1].text)*StrToInt(Ed2[1].text))+(StrToInt(Ed[2].text)*StrToInt(Ed2[2].text)))/(StrToInt(Ed2[1].text)+StrToInt(Ed2[2].text)));
label38.Caption:=Floattostr(((StrToInt(Ed1[1].text)*StrToInt(Ed2[1].text))+(StrToInt(Ed1[2].text)*StrToInt(Ed2[2].text)))/(StrToInt(Ed2[1].text)+StrToInt(Ed2[2].text)));
А вообще, если это нужно вычислять до 20, то можно все вычисления произвести в цикле.

Для варианта решения
(x1*z1)+(x2*z2)/(z1+z2)
(y1*z1)+(y2*z2)/(z1+z2)
Ваша процедура будет выглядеть:

Код:
procedure TForm1.Button8Click(Sender: TObject);
begin
n:=form1.ComboBox1.ItemIndex+1;
xz:=0; yz:=0; z:=0;
for i:=1 to n do
begin
if i<n then 
begin
xz:=xz+StrToInt(Ed[i].text)*StrToInt(Ed2[i].text);
yz:=yz+StrToInt(Ed1[i].text)*StrToInt(Ed2[i].text);
end;	
z:=z+StrToInt(Ed2[i].text);
end;
label37.Caption:=Floattostr(xz+StrToInt(Ed[n].text)*StrToInt(Ed2[n].text)/z);
label38.Caption:=Floattostr(yz+StrToInt(Ed1[n].text)*StrToInt(Ed2[n].text)/z);
end;
Для варианта решения
((x1*z1)+(x2*z2))/(z1+z2)
((y1*z1)+(y2*z2))/(z1+z2)

Код:
procedure TForm1.Button8Click(Sender: TObject);
begin
n:=form1.ComboBox1.ItemIndex+1;
xz:=0; yz:=0; z:=0;
for i:=1 to n do
begin
xz:=xz+StrToInt(Ed[i].text)*StrToInt(Ed2[i].text);
yz:=yz+StrToInt(Ed1[i].text)*StrToInt(Ed2[i].text);
z:=z+StrToInt(Ed2[i].text);
end;
label37.Caption:=Floattostr(xz/z);
label38.Caption:=Floattostr(yz/z);
end;
Ну в общем как-то так, писал прямо здесь - могут быть синтаксические ошибки