Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.07.2009, 18:53   #1
Lime
Форумчанин
 
Аватар для Lime
 
Регистрация: 10.02.2009
Сообщений: 815
Хорошо Полезно : Подсчёт формулы в строке (+-*/)

Всем привет. Написал сегодня такую функцию , думаю может быть полезна остальным.
Формула должна быть написана правильно
Проверку на правильность я ещё не написал)

Код:
function ExtCalcClear(formula:string):extended;
var
i2:integer;
st:tstringlist;
begin
formula:=stringreplace(formula,' ','',[rfreplaceall]);
st:=tstringlist.Create;
formula:=stringreplace(formula,'+',#10+'+'+#10,[rfreplaceall]);
formula:=stringreplace(formula,'-',#10+'-'+#10,[rfreplaceall]);
formula:=stringreplace(formula,'*',#10+'*'+#10,[rfreplaceall]);
formula:=stringreplace(formula,'/',#10+'/'+#10,[rfreplaceall]);
st.Text := formula;
i2 := 1;
while i2 <= st.Count-2 do
begin
if st[i2] = '*' then
begin
st[i2-1] := FloatToStr(StrToFloat(st[i2-1])*StrToFloat(st[i2+1]));
st.Delete(i2);
st.Delete(i2);
end else
if st[i2] = '/' then
begin
st[i2-1] := FloatToStr(StrToFloat(st[i2-1])/StrToFloat(st[i2+1]));
st.Delete(i2);
st.Delete(i2);
end else i2 := i2+1;
end;
i2 := 1;
while i2 <= st.Count-2 do
begin
if st[i2] = '+' then
begin
st[i2-1] := FloatToStr(StrToFloat(st[i2-1])+StrToFloat(st[i2+1]));
st.Delete(i2);
st.Delete(i2);
end else
if st[i2] = '-' then
begin
st[i2-1] := FloatToStr(StrToFloat(st[i2-1])-StrToFloat(st[i2+1]));
st.Delete(i2);
st.Delete(i2);
end else i2 := i2+1;
end;
result:= strtofloat(st[0]);
end;

function IsClear(formula:string):boolean;
begin
if ((pos('(',formula) = 0) and (pos(')',formula)=0)) then result := true else result := false;

end;

function ExtCalc(formula:string):Extended;
var str:string;
op,cl,oppos,clpos,i:integer;
begin
oppos:=-1;
clpos:=-1;
cl:=0;
op:=0;
formula:=stringreplace(formula,' ','',[rfreplaceall]);
if IsClear(formula) then result := ExtCalcclear(formula) else
begin
for i:=length(formula) downto 1 do
begin 

   if formula[i]='(' then
   begin
   op:=op+1;
   if oppos = -1 then oppos := i+1;
   if oppos > i+1 then oppos := i+1;
   end;

   if formula[i]=')' then
   begin
   cl:=cl+1;
   if clpos < i+1 then clpos := i+1;
   end;
   if ((op=cl)and (op<>0) and (cl<>0)) then
   begin 
   formula:=stringreplace(formula,copy(formula,oppos-1,clpos-oppos+1),floattostr(extcalc(copy(formula,oppos,clpos-oppos-1))),[rfreplaceall]);
   oppos:=-1;
   clpos:=-1;
   cl:=0;
   op:=0;
   end;


end;

end;
result := ExtCalcClear(formula);
end;
Пример использования :
Код:
procedure TForm1.Button1Click(Sender: TObject);
begin
showmessage(floattostr(extcalc(edit1.text)));
end;
Для проверки можете воспользоватся калькулятором в гугле. Достаточно ввести в поле поиска искомую формулу.
Lime вне форума Ответить с цитированием
Старый 09.07.2009, 21:42   #2
ОДИНОЧЕСТВО В СЕТИ
Любопытная Вредина
Участник клуба
 
Аватар для ОДИНОЧЕСТВО В СЕТИ
 
Регистрация: 19.06.2009
Сообщений: 1,285
По умолчанию

вот посмотрите интерпретатор на паскале может кому надо
Вложения
Тип файла: zip eval[1].zip (6.5 Кб, 23 просмотров)
Дурь - это особая форма материи, которая не возникает ниоткуда и не исчезает никуда, а лишь переходит из одной головы в другую.
ОДИНОЧЕСТВО В СЕТИ вне форума Ответить с цитированием
Старый 09.07.2009, 22:04   #3
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

ну тогда и мои пять копеек в тему примите...
вот здесь (Парсер математических выражений) я выкладывал свой старенький вариант парсера...
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Подсчёт голосов eldar PHP 6 01.06.2009 12:40
Подсчёт пробелов в ведённой строке prikolist Общие вопросы C/C++ 10 10.04.2009 15:52
Подсчёт трафика Альберт Работа с сетью в Delphi 2 10.09.2007 11:35
Эти программы полезно было бы написать Asain-Asa Софт 3 05.12.2006 22:21