1. Получи 30.000 рублей. Для получения денег необходимо принять участие в конкурсе авторов codeby. С условиями и призами можно ознакомиться на этой странице ...

    Внимание! Регистрация авторов на конкурс закрыта.

    Скрыть объявление
  2. Требуются разработчики и тестеры для проекта codebyOS. Требования для участия в проекте: Знание принципов работы ОС на базе Linux; Знание Bash; Крайне желательное знание CPP, Python, Lua; Навыки системного администрирования. Подробнее ...

    Скрыть объявление

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

Тема в разделе "Вопросы новичков и не только", создана пользователем Xatiko, 11 мар 2013.

  1. Xatiko

    Xatiko New Member

    Репутация:
    0
    Регистрация:
    5 мар 2013
    Сообщения:
    2
    Симпатии:
    0
    Доброго времени суток!
    Есть проблема при написании формулы. Приведу пример:

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

    gpatron Active Member

    Репутация:
    0
    Регистрация:
    13 авг 2009
    Сообщения:
    26
    Симпатии:
    0
    Если Вам нужно именно такой порядок вычислений:
    (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;
    Ну в общем как-то так, писал прямо здесь - могут быть синтаксические ошибки
     
Загрузка...

Поделиться этой страницей