这几天看到一个关于表达式计算的题目,于是想做一个多功能计算器。 首先,我们的计算器要能处理一般的算式和括号,例如(1+2)*3,其次也应该支持函数,例如1+abs(-100)。 程序的主要思路如下:
1. 解释算式中的所有函数,例如将abs(-100)替换为100
2. 处理括号,截取出括号里的内容并递归求值
3. 计算表达式为了实现第一步,我们先定义一个类型记录函数的名称和处理函数
TFn = function(param1: integer; param2: integer): string;
TFunc = record
name: string;
fn: TFn;
end;
并对其初始化
function _abs(param1: integer; param2: integer): string;
begin
_abs := intToStr(abs(param1));
end;
…..
Procedure init;
begin
funcs[1].name := 'abs';
funcs[1].fn := _abs;
funcs[2].name := 'acos';
funcs[2].fn := _acos;
funcs[3].name := 'asin';
funcs[3].fn := _asin;
funcs[4].name := 'atan';
funcs[4].fn := _atan;
funcs[5].name := 'atan2';
funcs[5].fn := _atan2;
funcs[6].name := 'ceil';
funcs[6].fn := _ceil;
funcs[7].name := 'cos';
funcs[7].fn := _cos;
funcs[8].name := 'exp';
funcs[8].fn := _exp;
end;
开始处理
for i := 1 to funcCount do //对所有的函数逐一扫描
begin
while pos(funcs[i].name, formula)<>0 do //如果扫描到了,就开始处理
begin
position := pos(funcs[i].name, formula);
delete(formula, position, length(funcs[i].name));
if formula[position] <> '(' then //假如函数名后面不是’(‘, 则报错
begin
outMsg('''('' not found');