c计算数学表达式代码
时间: 2023-07-28 13:12:52 浏览: 41
以下是一个简单的C代码,用于计算数学表达式的值:
```c
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define MAX_EXPR_LEN 100
int main()
{
char expr[MAX_EXPR_LEN];
printf("请输入数学表达式:");
fgets(expr, MAX_EXPR_LEN, stdin);
int i = 0;
double num_stack[MAX_EXPR_LEN];
char op_stack[MAX_EXPR_LEN];
int num_top = -1;
int op_top = -1;
while (expr[i] != '\n' && expr[i] != '\0') {
if (isdigit(expr[i])) {
double num = 0;
while (isdigit(expr[i])) {
num = num * 10 + (expr[i] - '0');
i++;
}
if (expr[i] == '.') {
i++;
double frac = 0.1;
while (isdigit(expr[i])) {
num += frac * (expr[i] - '0');
frac /= 10;
i++;
}
}
num_stack[++num_top] = num;
} else if (expr[i] == '(') {
op_stack[++op_top] = expr[i];
i++;
} else if (expr[i] == '+' || expr[i] == '-' || expr[i] == '*' || expr[i] == '/') {
while (op_top >= 0 && op_stack[op_top] != '(' && (
(expr[i] == '+' || expr[i] == '-') && (op_stack[op_top] == '+' || op_stack[op_top] == '-' || op_stack[op_top] == '*' || op_stack[op_top] == '/') ||
(expr[i] == '*' || expr[i] == '/') && (op_stack[op_top] == '*' || op_stack[op_top] == '/')
)) {
double b = num_stack[num_top--];
double a = num_stack[num_top--];
char op = op_stack[op_top--];
switch (op) {
case '+':
num_stack[++num_top] = a + b;
break;
case '-':
num_stack[++num_top] = a - b;
break;
case '*':
num_stack[++num_top] = a * b;
break;
case '/':
num_stack[++num_top] = a / b;
break;
}
}
op_stack[++op_top] = expr[i];
i++;
} else if (expr[i] == ')') {
while (op_stack[op_top] != '(') {
double b = num_stack[num_top--];
double a = num_stack[num_top--];
char op = op_stack[op_top--];
switch (op) {
case '+':
num_stack[++num_top] = a + b;
break;
case '-':
num_stack[++num_top] = a - b;
break;
case '*':
num_stack[++num_top] = a * b;
break;
case '/':
num_stack[++num_top] = a / b;
break;
}
}
op_top--;
i++;
} else {
i++;
}
}
while (op_top >= 0) {
double b = num_stack[num_top--];
double a = num_stack[num_top--];
char op = op_stack[op_top--];
switch (op) {
case '+':
num_stack[++num_top] = a + b;
break;
case '-':
num_stack[++num_top] = a - b;
break;
case '*':
num_stack[++num_top] = a * b;
break;
case '/':
num_stack[++num_top] = a / b;
break;
}
}
printf("结果:%.2f\n", num_stack[num_top]);
return 0;
}
```
该代码使用了两个栈,一个存储数字,一个存储操作符,依次处理表达式中的每个字符,并根据规则进行计算。需要注意的是,该代码仅支持四则运算和小数点,不支持其他高级运算符和函数。
相关推荐
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![doc](https://img-home.csdnimg.cn/images/20210720083327.png)
![-](https://csdnimg.cn/download_wenku/file_type_lunwen.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)