用 C 语言实现一个支持多个小数进行加减乘除及取余运算的程序,并处理运算优先级
时间: 2024-10-02 10:03:23 浏览: 37
C 语言简单加减乘除运算
在C语言中,你可以使用结构体和函数来创建一个简单的计算器,支持基本的四则运算(包括小数)以及取余操作。由于C语言本身并不直接支持高精度计算,我们通常会使用标准库中的`double`类型来进行浮点数运算。同时,我们需要手动处理运算符的优先级,这里我们将使用递归解析法来模拟表达式求值。
首先,定义一个结构体表示运算符及其优先级:
```c
typedef enum {
OP_ADD = 1,
OP_SUBTRACT,
OP_MULTIPLY,
OP_DIVIDE,
OP_MOD,
} Operator;
struct ExpressionNode {
double value;
Operator op;
struct ExpressionNode *left, *right;
};
```
接下来,编写用于解析并计算表达式的函数:
```c
double calculate(struct ExpressionNode *node) {
if (node->value != NULL) // leaf node, a number
return node->value;
else {
switch (node->op) {
case OP_ADD:
return calculate(node->left) + calculate(node->right);
case OP_SUBTRACT:
return calculate(node->left) - calculate(node->right);
case OP_MULTIPLY:
return calculate(node->left) * calculate(node->right);
case OP_DIVIDE:
return calculate(node->left) / calculate(node->right); // 检查除数是否为零
case OP_MOD:
return fmod(calculate(node->left), calculate(node->right));
}
}
}
```
为了处理输入的用户表达式,你需要创建一个解析函数,该函数根据用户输入构建表达树:
```c
struct ExpressionNode* parse_expression(char* expression) {
// 使用栈来存储运算符和对应的左右节点
stack_t nodes;
char* token;
int priority = 0;
// 分词、识别运算符和数字
split(expression, &token);
while (token != NULL) {
if (isdigit(*token)) { // 如果是数字,添加到当前节点
double val = atof(token);
struct ExpressionNode* current_node = malloc(sizeof(*current_node));
current_node->value = val;
push(nodes, current_node);
advance(token);
} else if (*token == '+' || *token == '-' || *token == '*' || *token == '/') { // 运算符
while (!is_empty(nodes) && priority <= precedence(*token)) {
struct ExpressionNode* right = pop(nodes);
struct ExpressionNode* left = pop(nodes);
double right_val = calculate(right);
double left_val = calculate(left);
struct ExpressionNode* new_node = malloc(sizeof(*new_node));
new_node->op = *token == '+' ? OP_ADD : *token == '-' ? OP_SUBTRACT :
*token == '*' ? OP_MULTIPLY : OP_DIVIDE;
new_node->left = left;
new_node->right = right;
new_node->value = calculate(new_node);
push(nodes, new_node);
}
priority = precedence(*token);
advance(token);
} else {
printf("Invalid operator: %c\n", *token);
break;
}
}
if (!is_empty(nodes))
return pop(nodes);
else
return NULL; // 表达式为空
}
// 其他辅助函数:split(), precedence(), advance()...
```
最后,你可以通过调用`parse_expression()`函数获取用户的输入并计算结果:
```c
int main() {
char input[100];
printf("请输入一个包含加减乘除运算的小数表达式:");
fgets(input, sizeof(input), stdin);
// 清理换行符
input[strlen(input) - 1] = '\0';
struct ExpressionNode *expr = parse_expression(input);
double result = calculate(expr);
printf("计算结果: %.2f\n", result);
free(expr); // 释放内存
return 0;
}
```
注意,这个示例并未处理所有错误情况,例如除数为零的情况需要额外检查,还有更复杂的运算符优先级规则等。这只是一个基础示例,实际应用可能需要更完善的错误处理和优化。
阅读全文