帮我用C语言编写一个算术表达式求值的程序,有如下要求:以字符序列的形式从终端输入语法正确、不含变量的算术表达式,利用给出的算符优先级关系,实现对算术四则混合运算的求解过程,输入要以#结尾
时间: 2024-12-22 22:12:42 浏览: 38
在C语言中,为了实现一个简单的算术表达式求值程序,我们可以使用递归函数结合栈数据结构。以下是一个基本的示例,它使用了`main()`函数接收用户输入,然后通过`evaluate_expression()`函数解析和计算表达式:
```c
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
typedef struct {
int precedence; // 算符优先级
char symbol; // 算符
} Operator;
// 算符优先级
const Operator priority[] = {
{'^', 3},
{'*', 2},
{ '/', 2 },
{'+', 1},
{'-', 1}
};
int evaluate_expression(char *expression);
// 递归函数,处理左操作数、当前操作符和右操作数
int apply_operator(int left, int right, char op) {
switch (op) {
case '+': return left + right;
case '-': return left - right;
case '*': return left * right;
case '/': if (right != 0) return left / right;
else return INT_MAX; // 防止除零错误
case '^': return left ^ right; // 对于乘方运算,这里假设不会发生溢出
}
}
int eat_number(char *expression) {
int num = 0;
while (isdigit(*expression)) {
num = num * 10 + (*expression - '0');
expression++;
}
return num;
}
int evaluate_expression(char *expression) {
if (*expression == '#') return 0; // 结束标志
// 读取数字
int num = eat_number(expression);
// 如果接下来不是操作符,则返回该数字
if (!isoperator(expression[0])) return num;
// 处理操作符
expression++; // 移动到第一个操作符
int right = evaluate_expression(expression); // 处理右操作数
while (expression < expression_end && isoperator(*expression)) {
expression++; // 移动到下一个操作符
int left = evaluate_expression(expression); // 处理左操作数
expression++; // 移动到操作符后的空格
int result = apply_operator(left, right, *expression++);
right = left = result;
}
return apply_operator(left, right, *expression); // 最终结果
}
int main() {
char input[100];
printf("请输入算术表达式(#结束):");
fgets(input, sizeof(input), stdin);
// 去掉末尾的换行符
input[strlen(input) - 1] = '\0';
int result = evaluate_expression(input);
printf("计算结果是:%d\n", result);
return 0;
}
```
**注意事项**:
- 这个例子只处理了整数和基本的算术运算,并未考虑括号和复合运算。
- `eat_number()` 和 `isoperator()` 函数在这里并未详细实现,实际项目中需要自己实现。
阅读全文