ПроЭктировщик
Регистрация: 31.01.2010
Адрес: Россия, респ. Башкортостан, г. Бирск
Сообщений: 137
Написано 12 полезных сообщений (для 17 пользователей)
|
Ответ: UniCalc. Универсальный калькулятор
Вот функция подсчёта, можно упростить, но мне лень.
function Counting(bufstring : string): string;//подсчёт всей строки
var
minus : boolean;
bufstring2,bufstring3 : string;
OpenBracket,CloseBracket : integer;//позиции открывающей и закрывающей скобок
FirstNumber,SecondNumber : string;//первое и второе буферные числа
i,j : integer;//счётчики
ch : char;
begin
//решение выражений в скобках
while pos(bufstring,'(')<>-1 do
if getChar(bufstring,pos(bufstring,'(')-1)<>' ' then
//место для решения функций
nop;
//-------------------------
else
begin
OpenBracket:=pos(bufstring,'(');
bufstring2:=copy(bufstring,OpenBracket+1,length(bufstring));
i:=0;
for CloseBracket:=0 to length(bufstring2) do
if getChar(bufstring2,CloseBracket)='(' then
i:=i+1;
else if getChar(bufstring2,CloseBracket)=')' then
if i<>0 then
i:=i-1;
else
break;
bufstring2:=copy(bufstring2,0,CloseBracket);
bufstring:=copy(bufstring,0,OpenBracket)+Counting(bufstring2)+copy(bufstring,OpenBracket+CloseBracket+2,length(bufstring));
end;
//---------------------------
//умножение
while (pos(bufstring,'*')<>-1) or (pos(bufstring,'/')<>-1) do
begin
i:=pos(bufstring,'*');
j:=pos(bufstring,'/');
if (i<>-1) and (((j<>-1) and (i<j)) or (j=-1)) then
ch:=getChar(bufstring,i);
if (j<>-1) and (((i<>-1) and (j<i)) or (i=-1)) then
ch:=getChar(bufstring,j);
bufstring2:=copy(bufstring,0,pos(bufstring,ch)-1);
j:=PositionOfLastNumber(bufstring2);
FirstNumber:=copy(bufstring2,j,length(bufstring2));
FirstNumber:=NumCalibration(FirstNumber);
bufstring2:='';
for i:=pos(bufstring,ch)+2 to length(bufstring) do
if getChar(bufstring,i)=' ' then
break;
if i>length(bufstring) then
i:=i-1;
SecondNumber:=copy(bufstring,pos(bufstring,ch)+2,i);
SecondNumber:=NumCalibration(SecondNumber);
bufstring:=copy(bufstring,0,j)+OperationFilter(FirstNumber,SecondNumber,ch)+copy(bufstring,i,length(bufstring));
end;
//---------
//вычитание
bufstring3:=bufstring;
repeat
if (pos(bufstring3,'-')<>-1) then
if getChar(bufstring3,pos(bufstring3,'-')+1)=' ' then
begin
bufstring2:=copy(bufstring,0,pos(bufstring,'-')-1);
j:=PositionOfLastNumber(bufstring2);
FirstNumber:=copy(bufstring2,j,length(bufstring2));
FirstNumber:=NumCalibration(FirstNumber);
bufstring2:='';
for i:=pos(bufstring,'-')+2 to length(bufstring) do
if getChar(bufstring,i)=' ' then
break;
if i>length(bufstring) then
i:=i-1;
SecondNumber:=copy(bufstring,pos(bufstring,'-')+2,i);
SecondNumber:=NumCalibration(SecondNumber);
bufstring:=copy(bufstring,0,j)+OperationFilter(FirstNumber,SecondNumber,'-')+copy(bufstring,i,length(bufstring));
bufstring3:=bufstring;
end;
else
bufstring3:=copy(bufstring3,0,pos(bufstring3,'-'))+copy(bufstring3,pos(bufstring3,'-')+1,length(bufstring3));
else
break;
until false;
//---------
//сложение
while pos(bufstring,'+')<>-1 do
begin
bufstring2:=copy(bufstring,0,pos(bufstring,'+')-1);
j:=PositionOfLastNumber(bufstring2);
FirstNumber:=copy(bufstring2,j,length(bufstring2));
FirstNumber:=NumCalibration(FirstNumber);
bufstring2:='';
for i:=pos(bufstring,'+')+2 to length(bufstring) do
if getChar(bufstring,i)=' ' then
break;
if i>length(bufstring) then
i:=i-1;
SecondNumber:=copy(bufstring,pos(bufstring,'+')+2,i);
SecondNumber:=NumCalibration(SecondNumber);
bufstring:=copy(bufstring,0,j)+OperationFilter(FirstNumber,SecondNumber,'+')+copy(bufstring,i,length(bufstring));
end;
//--------
Counting:=bufstring;
end;
|