请按照四则运算加、减、乘、除、幂(^)和括号的优先关系和惯例,用C语言编写计算器程序
时间: 2024-01-09 10:04:52 浏览: 231
一个计算器的设计具有基本的加、减、乘、除等四则运算
3星 · 编辑精心推荐
以下是一个简单的计算器程序,支持基本的加、减、乘、除、幂和括号运算:
```
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define MAX_EXPR_LEN 100
int is_operator(char c)
{
return c == '+' || c == '-' || c == '*' || c == '/' || c == '^';
}
int is_digit(char c)
{
return c >= '0' && c <= '9';
}
int priority(char c)
{
if (c == '+' || c == '-')
return 1;
else if (c == '*' || c == '/')
return 2;
else if (c == '^')
return 3;
else
return 0;
}
double eval(char *expr)
{
char stack_op[MAX_EXPR_LEN];
double stack_val[MAX_EXPR_LEN];
int top_op = -1, top_val = -1;
int i = 0;
while (expr[i]) {
if (expr[i] == '(') {
stack_op[++top_op] = expr[i];
} else if (is_digit(expr[i])) {
double val = expr[i] - '0';
while (is_digit(expr[i+1])) {
val = val * 10 + (expr[++i] - '0');
}
stack_val[++top_val] = val;
} else if (is_operator(expr[i])) {
while (top_op >= 0 && priority(stack_op[top_op]) >= priority(expr[i])) {
char op = stack_op[top_op--];
double b = stack_val[top_val--];
double a = stack_val[top_val--];
double res = 0;
switch (op) {
case '+': res = a + b; break;
case '-': res = a - b; break;
case '*': res = a * b; break;
case '/': res = a / b; break;
case '^': res = pow(a, b); break;
}
stack_val[++top_val] = res;
}
stack_op[++top_op] = expr[i];
} else if (expr[i] == ')') {
while (stack_op[top_op] != '(') {
char op = stack_op[top_op--];
double b = stack_val[top_val--];
double a = stack_val[top_val--];
double res = 0;
switch (op) {
case '+': res = a + b; break;
case '-': res = a - b; break;
case '*': res = a * b; break;
case '/': res = a / b; break;
case '^': res = pow(a, b); break;
}
stack_val[++top_val] = res;
}
top_op--;
}
i++;
}
while (top_op >= 0) {
char op = stack_op[top_op--];
double b = stack_val[top_val--];
double a = stack_val[top_val--];
double res = 0;
switch (op) {
case '+': res = a + b; break;
case '-': res = a - b; break;
case '*': res = a * b; break;
case '/': res = a / b; break;
case '^': res = pow(a, b); break;
}
stack_val[++top_val] = res;
}
return stack_val[top_val];
}
int main()
{
char expr[MAX_EXPR_LEN];
printf("请输入表达式:");
fgets(expr, MAX_EXPR_LEN, stdin);
double result = eval(expr);
printf("结果为:%g\n", result);
return 0;
}
```
程序中使用了两个栈,一个用来存储运算符,一个用来存储数字。遍历表达式时,如果遇到数字,则将其转换为 double 类型并压入数字栈中;如果遇到运算符,则将其与运算符栈顶元素比较优先级,如果当前运算符优先级较低,则将栈顶运算符弹出,并从数字栈中弹出两个数进行计算,将计算结果压入数字栈中,直到栈顶运算符优先级低于当前运算符或栈空为止,然后将当前运算符压入运算符栈中。如果遇到左括号,则将其压入运算符栈中;如果遇到右括号,则弹出运算符栈中的元素,直到遇到左括号为止,并从数字栈中弹出两个数进行计算,将计算结果压入数字栈中。最后,再依次弹出运算符栈中的元素,进行计算,直到运算符栈为空,此时数字栈中的唯一元素即为表达式的值。
阅读全文