• B правой части каждого сообщения есть стрелки и . Не стесняйтесь оценивать ответы. Чтобы автору вопроса закрыть свой тикет, надо выбрать лучший ответ. Просто нажмите значок в правой части сообщения.

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

  • Автор темы Xatiko
  • Дата начала
X

Xatiko

Доброго времени суток!
Есть проблема при написании формулы. Приведу пример:

Для одного объекта:
(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. Но так как уже не работает для двух, смысла дальше нет двигаться.
Есть догадки, что не так расставленны скобки и компилятор выполняет не те арифмитические действия.
 
G

gpatron

Если Вам нужно именно такой порядок вычислений:
(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;

Ну в общем как-то так, писал прямо здесь - могут быть синтаксические ошибки
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!