% --- Executes on button press in f5. function f5_Callback(hObject, eventdata, handles) % hObject handle to f5 (see GCBO) textString = get(handles.edit1,'String'); result = eval(textString); set(handles.edit2,'String',num2str(result )); % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA),改进这段代码使eval函数可以运算含“()”等优先级运算方式
时间: 2024-03-10 22:49:03 浏览: 56
要使 `eval` 函数能够正确处理运算符的优先级,可以使用 `paren` 函数将表达式中的括号嵌套转换成嵌套的 cell 数组,再利用递归函数计算每个嵌套的表达式。
下面是改进后的代码:
```
% --- Executes on button press in f5.
function f5_Callback(hObject, eventdata, handles)
% hObject handle to f5 (see GCBO)
textString = get(handles.edit1,'String');
result = evaluateExpression(textString);
set(handles.edit2,'String',num2str(result ));
function result = evaluateExpression(expression)
% 递归计算表达式
expression = strtrim(expression);
if ~isempty(strfind(expression, '('))
% 如果表达式中包含括号,则需要将括号嵌套转换成嵌套的 cell 数组
nestedExpr = paren(expression);
result = nestedExpr;
for i = 1:numel(nestedExpr)
result{i} = evaluateExpression(nestedExpr{i});
end
% 将嵌套的 cell 数组转换为字符串
result = cell2mat(result);
else
% 如果表达式中不包含括号,则直接求值
result = evalin('base', expression);
end
function result = paren(expr)
% 将表达式中的括号嵌套转换成嵌套的 cell 数组
stack = {};
for i = 1:length(expr)
switch expr(i)
case '('
stack{end+1} = '';
case ')'
top = stack{end};
stack(end) = [];
if numel(stack) == 0
stack{1} = top;
else
stack{end} = [stack{end} top];
end
otherwise
if numel(stack) == 0
stack{1} = expr(i);
else
stack{end} = [stack{end} expr(i)];
end
end
end
result = stack;
```
这个改进的代码中,`evaluateExpression` 函数递归地计算表达式,如果表达式中包含括号,则使用 `paren` 函数将嵌套的括号转换成嵌套的 cell 数组,再递归地计算每个嵌套的表达式,最后将嵌套的 cell 数组转换成字符串。`paren` 函数用栈来处理表达式中的括号,将括号嵌套转换成嵌套的 cell 数组。
阅读全文