Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Нахождение X 
:(
    Опции темы
Ak47black
Дата 10.3.2006, 21:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2205
Регистрация: 2.12.2005

Репутация: 1
Всего: 0



Привет всем.
Создал свою функцию которая позваляет вычеслять пример с любым уровнем скобок ,сунусами и т.п. например1+(sin(89+sin(90))).
Работает моя функция нормально.
Только некак немогу научить мою функцию находить X например (x/2 + x +10), уже весь интернет перерыл но никак немогу найти то что надо. Пожалуйста подскажите что мне нужно сделать или искать в интернете.
Вот моя функция.
Код

///////////////////////////////////
type  
  StrArr = array of String;
   TArrayString = array of string;  
///////////////////////////////////

function podciot (s:String): string;
var
resultat:Real;
i:Integer;
cisla: StrArr;
znaki: StrArr;

function stepen(cisl:Real;stepen:Integer):Real;
var
l:Integer;
res:Real;
begin
//ShowMessage(FloatToStr(cisl));
//ShowMessage(IntToStr(stepen));
if (IntToStr(stepen))[1]='-' then
begin
for l:=2 to -stepen do cisl:=cisl*cisl;
if (IntToStr(stepen))[1]='-' then Result:=1/cisl else Result:=cisl;
end
else
begin
for l:=2 to stepen do
cisl:=cisl*cisl;
if (IntToStr(stepen))[1]='-' then Result:=1/cisl else Result:=cisl;
end;
end;

function v_skobke(operand:string;stroka:String):string;
var
skobka:Integer;
l:Integer;
begin

skobka:=0;
l:=pos(operand,stroka)+Length(operand)-1;
repeat
if stroka[l]='(' then skobka:=skobka+1;
if stroka[l]=')' then skobka:=skobka-1;
l:=l+1;
until (skobka=0);
//ShowMessage(copy(stroka,pos(operand,stroka)+Length(operand),l-(pos(operand,stroka)+Length(operand)+1)));
if operand='sin(' then Insert(FloatToStr(sin(DegToRad(strtofloat(podciot(copy(stroka,pos(operand,stroka)+Length(operand),l-(pos(operand,stroka)+Length(operand)+1))))))),stroka,pos(operand,stroka));
if operand='cos(' then Insert(FloatToStr(cos(DegToRad(strtofloat(podciot(copy(stroka,pos(operand,stroka)+Length(operand),l-(pos(operand,stroka)+Length(operand)+1))))))),stroka,pos(operand,stroka));
if operand='tan(' then Insert(FloatToStr(tan(DegToRad(strtofloat(podciot(copy(stroka,pos(operand,stroka)+Length(operand),l-(pos(operand,stroka)+Length(operand)+1))))))),stroka,pos(operand,stroka));
if operand='cot(' then Insert(FloatToStr(Cot(DegToRad(strtofloat(podciot(copy(stroka,pos(operand,stroka)+Length(operand),l-(pos(operand,stroka)+Length(operand)+1))))))),stroka,pos(operand,stroka));
//ShowMessage(IntToStr(strtoint(copy(copy(stroka,pos(operand,stroka)+Length(operand),l-(pos(operand,stroka)+Length(operand)+1)),pos(',',copy(stroka,pos(operand,stroka)+Length(operand),l-(pos(operand,stroka)+Length(operand)+1)))+1,length(copy(stroka,pos(operand,stroka)+Length(operand),l-(pos(operand,stroka)+Length(operand)+1)))))));
if operand='stp(' then Insert(FloatToStr(stepen((strtofloat(podciot(copy(stroka,pos(operand,stroka)+Length(operand),pos('.',copy(stroka,(pos(operand,stroka)+Length(operand)+1),l-(pos(operand,stroka)+Length(operand)+1))))))),( (strtoint(copy(copy(stroka,pos(operand,stroka)+Length(operand),l-(pos(operand,stroka)+Length(operand)+1)),pos('.',copy(stroka,pos(operand,stroka)+Length(operand),l-(pos(operand,stroka)+Length(operand)+1)))+1,length(copy(stroka,pos(operand,stroka)+Length(operand),l-(pos(operand,stroka)+Length(operand)+1)))))) ))),stroka,pos(operand,stroka));
if operand='sqr(' then Insert(FloatToStr(Sqrt((strtofloat(podciot(copy(stroka,pos(operand,stroka)+Length(operand),l-(pos(operand,stroka)+Length(operand)+1))))){òóòñ})),stroka,pos(operand,stroka));
if operand='(' then
Insert(FloatToStr(((strtofloat(podciot(copy(stroka,pos(operand,stroka)+Length(operand),l-(pos(operand,stroka)+Length(operand)+1))))))),stroka,pos(operand,stroka));
//ShowMessage(IntToStr(l));
skobka:=0;
l:=pos(operand,stroka)+Length(operand)-1;
repeat
if stroka[l]='(' then skobka:=skobka+1;
if stroka[l]=')' then skobka:=skobka-1;
l:=l+1;
until (skobka=0);
///////
//ShowMessage(copy(stroka,pos(operand,stroka),l-(pos(operand,stroka))));

delete(stroka,pos(operand,stroka),l-(pos(operand,stroka)));
//ShowMessage(stroka);
//ShowMessage(stroka);
Result:=stroka;
end;

function udalit_xlam(a:StrArr):StrArr;
var
count,k:Integer;
begin
count:=0;
for k:=0 to Length(a)-1 do
  begin
    if k+count<Length(a) then
      begin
      a[k]:=a[k+count];
      while (a[k]='')and(k+count<Length(a))do
        begin
        count:=count+1;
        if k+count<Length(a) then a[k]:=a[k+count];
      //  ShowMessage(a[k]);

        end;
      end;

end;
SetLength(a,Length(a)-count);
Result:=a;
end;

procedure cut_masiv;
var
k:Integer;
begin

cisla:=udalit_xlam(cisla);

//for k:=0 to Length(znaki)-1 do ShowMessage(znaki[k]);
znaki:=udalit_xlam(znaki);
//for k:=0 to Length(cisla)-1 do ShowMessage(cisla[k]);

end;


function Cislo(As_Arg: Char): Boolean;
begin
  Cislo := As_Arg in ['0','1','2','3','4','5','6','7','8','9',','];
end;

function znak(As_Arg: Char): Boolean;
begin
  znak := As_Arg in ['+','-','*','/'];
end;

procedure split_to_elements;
var
i,k:Integer;
position:Integer;
temp:String;
begin
for i:=0 to Length(s)-1 do
begin
if pos('+-',s)<>0 then Delete(s,pos('+-',s),1);
if pos('++',s)<>0 then Delete(s,pos('++',s),1);
if pos('--',s)<>0 then
begin
Insert('+',s,pos('--',s));
Delete(s,pos('--',s),2);
end;
if pos('-+',s)<>0 then Delete(s,pos('-+',s)+1,1);
end;

{for i:=1 to Length(s) do
begin
if s[i]='.' then s[i]:=',';
end;}


for i:=1 to Length(s) do
begin
////////////////////Naxozdenijr cisel
if Cislo(s[i]) then
begin
if Cislo(s[i-1]) then
begin
temp:=(cisla[Length(cisla)-1])+s[i];
cisla[Length(cisla)-1]:=(temp);
end
else
begin
SetLength(cisla,Length(cisla)+1);
cisla[Length(cisla)-1]:=(s[i]);
if (i=2) and (s[1]='-') then
cisla[Length(cisla)-1]:='-'+cisla[Length(cisla)-1];
end;
end;
if znak(s[i])and(i<>1) then
begin
SetLength(znaki,Length(znaki)+1);
znaki[Length(znaki)-1]:=(s[i]);
end;
///////////////////naxozdenije znakov
end;
end;



function naiti_resenije:string;
var
i:Integer;
dump:Integer;
begin
try

for i:=0 to Length(s)-1 do
begin

if pos('sin(',s)<>0 then
begin
s:=v_skobke('sin(',s);
//ShowMessage(s);
end;
if pos('cos(',s)<>0 then
begin
s:=v_skobke('cos(',s);
end;

if pos('tan(',s)<>0 then
begin
s:=v_skobke('tan(',s);
end;

if pos('cot(',s)<>0 then
begin
s:=v_skobke('cot(',s);
end;

if pos('sqr(',s)<>0 then
begin
s:=v_skobke('sqr(',s);
end;

if pos('stp(',s)<>0 then
begin
s:=v_skobke('stp(',s);
end;

end;

for i:=0 to Length(s)-1 do
begin
if pos('(',s)<>0 then
begin
s:=v_skobke('(',s);
end;
end;

//ShowMessage(s);
split_to_elements;
resultat:=0;
//for i:=0 to Length(znaki)-1 do ShowMessage(znaki[i]);
for i:=0 to Length(znaki)-1 do
begin
if znaki[i]='*' then begin
//ShowMessage(cisla[i]+'   '+cisla[i+1]);
cisla[i+1]:=(FloatToStr(StrToFloat(cisla[i])*StrToFloat(cisla[i+1])));
cisla[i]:='';
znaki[i]:='';
 end;
end;
cut_masiv;

for i:=0 to Length(znaki)-1 do
begin
if znaki[i]='/' then begin cisla[i+1]:=(FloatToStr(StrToFloat(cisla[i])/StrToFloat(cisla[i+1])));cisla[i]:='';znaki[i]:='';end;

end;
cut_masiv;
for i:=0 to Length(znaki)-1 do
begin
if znaki[i]='+' then begin  cisla[i+1]:=(FloatToStr(StrToFloat(cisla[i])+StrToFloat(cisla[i+1])));cisla[i]:='';znaki[i]:=''; end;
end;
//for i:=0 to Length(cisla)-1 do ShowMessage(cisla[i]);
cut_masiv;
//for i:=0 to Length(cisla)-1 do ShowMessage(cisla[i]);
for i:=0 to Length(znaki)-1 do
begin
if znaki[i]='-' then begin cisla[i+1]:=(FloatToStr(StrToFloat(cisla[i])-StrToFloat(cisla[i+1])));cisla[i]:='';znaki[i]:=''; end;
end;
cut_masiv;
for i:=0 to Length(cisla)-1 do
begin
Result:=cisla[i];

end;
SetLength(cisla,0);
SetLength(znaki,0);
except ShowMessage('Îøèáêà');
end;
end;

begin
//ShowMessage(naiti_resenije);
Result:=naiti_resenije;
end;


PM MAIL   Вверх
SoWa
Дата 10.3.2006, 21:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Харекришна
****


Профиль
Группа: Комодератор
Сообщений: 2422
Регистрация: 18.10.2004

Репутация: 2
Всего: 74



Решить уравнение?


--------------------
Всем добра smile
PM MAIL ICQ   Вверх
Ak47black
Дата 10.3.2006, 21:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2205
Регистрация: 2.12.2005

Репутация: 1
Всего: 0



Цитата(SoWa @ 10.3.2006, 21:47)
Решить уравнение?

Что-бы например я вводил троку '2+x/2' пропускал через свою процедуру и получал X=-1
PM MAIL   Вверх
SoWa
Дата 10.3.2006, 22:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Харекришна
****


Профиль
Группа: Комодератор
Сообщений: 2422
Регистрация: 18.10.2004

Репутация: 2
Всего: 74



Методом деления пополам, для примера. Но он не точный.
Добавлено @ 22:08
Цитата(Ak47black @ 10.3.2006, 21:59 Найти цитируемый пост)
Что-бы например я вводил троку '2+x/2' пропускал через свою процедуру и получал X=-1

У тебя как с математикой? Во первых, почему должно быть -1? А если это равно 0, то х=-4


--------------------
Всем добра smile
PM MAIL ICQ   Вверх
Ak47black
Дата 10.3.2006, 22:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2205
Регистрация: 2.12.2005

Репутация: 1
Всего: 0



Цитата(SoWa @ 10.3.2006, 22:06)
Методом деления пополам, для примера. Но он не точный.

Логически на бумаге то легко решить ,только как это всё осошиствить в функции.
Я несшетал когда писал.

Это сообщение отредактировал(а) Ak47black - 10.3.2006, 22:18
PM MAIL   Вверх
SoWa
Дата 10.3.2006, 22:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Харекришна
****


Профиль
Группа: Комодератор
Сообщений: 2422
Регистрация: 18.10.2004

Репутация: 2
Всего: 74



Так я не понял, у тебя функция приравнивается к нулю?


--------------------
Всем добра smile
PM MAIL ICQ   Вверх
Ak47black
Дата 10.3.2006, 22:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2205
Регистрация: 2.12.2005

Репутация: 1
Всего: 0



Цитата(SoWa @ 10.3.2006, 22:13)
Так я не понял, у тебя функция приравнивается к нулю?

Да
PM MAIL   Вверх
SoWa
Дата 10.3.2006, 22:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Харекришна
****


Профиль
Группа: Комодератор
Сообщений: 2422
Регистрация: 18.10.2004

Репутация: 2
Всего: 74



Метод деления пополам осуществляется проще некуда. Берешь первое значение Х=(a+b)/2
Если f(X)=0 все хорошо.
Если нет.
If f(x)*f(a)<0 then b:=x else a:=x;
И так далее.
Добавлено @ 22:23
Что сложного? Так тебе надо цикл While и переменные X,a,b,E(погрешность), несколько промежуточных переменных.
Кстати, код ты зря выложил. Выложи лучше в Арсенал Форумистов. Здесь страница долго грузится.

PS Функцию я перепроверю, ибо математика у тебя действительно хромает. Не в обиду.

Это сообщение отредактировал(а) SoWa - 10.3.2006, 22:25


--------------------
Всем добра smile
PM MAIL ICQ   Вверх
Ak47black
Дата 10.3.2006, 22:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2205
Регистрация: 2.12.2005

Репутация: 1
Всего: 0



Цитата(SoWa @ 10.3.2006, 22:19)
Метод деления пополам осуществляется проще некуда. Берешь первое значение Х=(a+b)/2
Если f(X)=0 все хорошо.
Если нет.
If f(x)*f(a)<0 then b:=x else a:=x;
И так далее.

А если например 2+2*x/4 + 5*x/2 +6/x*9 = 0 примерно чтото такого. smile
Я хочю добиться универсально функции.

Это сообщение отредактировал(а) Ak47black - 10.3.2006, 22:26
PM MAIL   Вверх
SoWa
Дата 10.3.2006, 22:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Харекришна
****


Профиль
Группа: Комодератор
Сообщений: 2422
Регистрация: 18.10.2004

Репутация: 2
Всего: 74



А какая разница? Определяй функцию на некотором интервале и решай. Хотя есть еще методы, но о них мне долго рассказывать: я их знаю поверхностно.


--------------------
Всем добра smile
PM MAIL ICQ   Вверх
sergejzr
Дата 10.3.2006, 22:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: 1
Всего: 360



Это нетривиально. Но в принципе для линейных уравнений - переноси все с иксом в одну сторону, выноси за скобки, дели smile))


--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
SoWa
Дата 10.3.2006, 22:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Харекришна
****


Профиль
Группа: Комодератор
Сообщений: 2422
Регистрация: 18.10.2004

Репутация: 2
Всего: 74



Это ему уже в Алгоритмы.


--------------------
Всем добра smile
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0594 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.