使用c语言写一个函数 计算正确的四则整形运算表达式的值。输入一个正确四则整形运算表达式字符串,输出计算结果(除法可以直接执行整数除,不考虑小数,如5/4等于1)。如输入“(17+3)/4+2",输出7。
时间: 2024-11-25 20:13:56 浏览: 72
在C语言中,实现这样的功能需要使用递归解析器或者栈来处理表达式的求值,因为标准库并不直接提供这种解析和计算的能力。下面是一个简单的示例,使用递归解析并计算加减乘除四则运算的表达式:
```c
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
int is_number(char c) {
return (isdigit(c) || (c == '-' && !isspace(c)));
}
int precedence(char op) {
if (op == '+' || op == '-') return 1;
else if (op == '*' || op == '/') return 2;
return 0; // 非运算符
}
int apply_operator(int a, int b, char op) {
switch (op) {
case '+': return a + b;
case '-': return a - b;
case '*': return a * b;
case '/': return a / b; // 注意这里假设除法不会溢出
}
return 0; // 如果不是合法运算符,返回0
}
int evaluate_expression(const char* expression) {
int num = 0, prev_op = 0;
bool negative = false;
for (const char* ptr = expression; *ptr != '\0'; ++ptr) {
if (is_number(*ptr)) {
if (negative)
num = num * 10 - (*ptr - '0');
else
num = num * 10 + (*ptr - '0');
negative = false;
} else if (*ptr == '-') {
if (!isdigit(ptr[1])) { // 检查是否紧跟数字
num *= -1; // 单独的负号
} else {
negative = true;
}
} else if (*ptr == '(') {
// 处理左括号...
} else if (*ptr == ')') {
// 处理右括号...
} else if (isspace(*ptr)) continue;
else {
while (prev_op != 0 && precedence(prev_op) >= precedence(*ptr))
num = apply_operator(num, stack.pop(), stack.top());
stack.push(*ptr); // 保存当前运算符
prev_op = *ptr;
}
}
while (prev_op != 0) {
num = apply_operator(num, stack.pop(), stack.top());
prev_op = stack.top();
}
return num;
}
void tokenize(char* expression, int* tokens, int* count) {
// 实现表达式的token化
// ...
}
int main() {
char expression[] = "(17+3)/4+2";
int tokens[100];
int token_count;
tokenize(expression, tokens, &token_count);
int result = evaluate_expression(tokens);
printf("The result of the expression is: %d\n", result);
return 0;
}
```
这个示例仅实现了基础的解析逻辑,实际应用中可能需要更复杂的错误检查、优先级队列等结构来处理括号和更多的运算符。注意,在此代码中并未完全实现`tokenize`函数,你需要自定义该函数来将表达式分解成一系列的操作数和运算符。
阅读全文