C语言 用程序实现求解用户输入的表达式的值,例如输入1+2*3-16/2,则输出为-1。
时间: 2024-10-14 14:12:34 浏览: 44
在C语言中,要实现这个功能,你可以使用`stdio.h`库来进行标准输入输出,`math.h`库提供数学函数,以及自定义的数据结构和算法来解析表达式。下面是一个简单的示例,它使用了递归函数来计算中缀表达式的值:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
// 定义操作符优先级
enum precedence { ADD = 1, SUB, MUL, DIV };
// 结构体表示表达式的节点
typedef struct {
char operator; // 操作符
double value; // 操作数
int left, right; // 左右子节点索引
} Node;
// 计算两个节点的运算结果
double calculate(Node *node) {
switch (node->operator) {
case '+':
return node->value + calculate(node->left);
case '-':
return node->value - calculate(node->left);
case '*':
return node->value * calculate(node->left);
case '/':
if (fabs(node->left.value) > 0)
return node->value / calculate(node->left);
else
return 0;
default:
printf("Invalid operator\n");
exit(1);
}
}
// 从字符串解析并计算表达式
double evaluateExpression(char *expression) {
Node *tokens = malloc(sizeof(Node));
tokens[0].value = atof(expression);
tokens[0].left = tokens[0].right = -1;
char *token = strtok(expression, " ()+-*/");
while (token != NULL) {
if (isdigit(*token)) {
tokens = realloc(tokens, sizeof(Node) * (strlen(expression) + 1));
tokens[strlen(tokens) - 1].right = strlen(tokens) - 1;
tokens[strlen(tokens)] = tokens[strlen(tokens) - 1];
tokens[strlen(tokens) - 1].value = atof(token++);
} else {
int precedenceValue = precedence[token[0]];
int nextTokenIsOp = isdigit(token[1]);
int left = tokens[strlen(tokens) - 1].right + 1;
for (int i = left; i < strlen(tokens); i++) {
if (!nextTokenIsOp || precedence[token[i]] <= precedenceValue) break;
tokens[i].operator = token[0];
tokens[i].right = i;
tokens = realloc(tokens, sizeof(Node) * (strlen(expression) + 1));
tokens[strlen(tokens) - 1].right = i;
token++;
nextTokenIsOp = isdigit(*token);
}
tokens[strlen(tokens)].operator = *token;
tokens[strlen(tokens)].right = strlen(tokens);
token++;
}
}
free(tokens);
return calculate(&tokens[0]);
}
int main() {
char expression[50];
printf("Enter an expression: ");
fgets(expression, sizeof(expression), stdin);
expression[strcspn(expression, "\n")] = '\0'; // Remove newline character
double result = evaluateExpression(expression);
printf("Result: %.2lf\n", result);
return 0;
}
```
在这个示例中,程序首先读取用户输入的表达式,然后通过`strtok`和一些条件判断将表达式分解成一个个节点,并根据操作符优先级进行处理。最后,`calculate`函数会根据操作符执行相应的计算。
注意:这个示例只适用于简单的一元一次表达式,对于更复杂的表达式(如括号、指数等),需要更复杂的设计,比如使用堆栈来处理运算符和操作数。
阅读全文