编写一个C语言程序,求算术表达式的值,该算术表达式包含加减乘除括号,使用递归处理括号,除了主函数,只包含一个函数
时间: 2023-06-26 09:09:45 浏览: 112
下面是一个简单的递归函数实现,可以求解包含加减乘除括号的算术表达式的值:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int eval(char *expr);
int main()
{
char expr[100];
printf("Enter an arithmetic expression: ");
fgets(expr, 100, stdin);
int result = eval(expr);
printf("Result: %d", result);
return 0;
}
int eval(char *expr)
{
int len = strlen(expr);
int i = 0, num = 0, op = '+', term = 0, res = 0;
while (i < len) {
if (expr[i] >= '0' && expr[i] <= '9') {
num = num * 10 + expr[i] - '0';
} else if (expr[i] == '+' || expr[i] == '-' || expr[i] == '*' || expr[i] == '/') {
switch (op) {
case '+':
term += num;
break;
case '-':
term -= num;
break;
case '*':
term *= num;
break;
case '/':
term /= num;
break;
}
num = 0;
op = expr[i];
} else if (expr[i] == '(') {
int j = i + 1, cnt = 1;
while (cnt > 0 && j < len) {
if (expr[j] == '(') cnt++;
if (expr[j] == ')') cnt--;
j++;
}
num = eval(strndup(expr + i + 1, j - i - 2));
i = j - 1;
} else if (expr[i] == ')') {
switch (op) {
case '+':
term += num;
break;
case '-':
term -= num;
break;
case '*':
term *= num;
break;
case '/':
term /= num;
break;
}
res = term;
return res;
}
i++;
}
switch (op) {
case '+':
res = term + num;
break;
case '-':
res = term - num;
break;
case '*':
res = term * num;
break;
case '/':
res = term / num;
break;
}
return res;
}
```
函数 `eval` 接收一个算术表达式字符串 `expr`,并返回计算结果。在函数中,我们使用一个循环遍历输入字符串,同时使用变量 `num` 和 `op` 来保存当前遇到的数字和操作符,使用变量 `term` 和 `res` 分别保存当前的项值和最终结果。当遇到括号时,我们使用递归调用 `eval` 函数来计算括号内的表达式,并将结果赋值给 `num`。最终,当我们遍历完整个字符串时,我们将 `num` 和 `term` 进行最后一次运算,得到最终的结果。
注意,在代码中我们使用了 `strndup` 函数来复制子字符串,这需要在头文件中添加 `#define _GNU_SOURCE`。此外,该函数只在 POSIX 环境下可用,因此如果您的系统不支持该函数,您可以自己实现一个字符串复制函数。
阅读全文