用C语言编译一个简易计算器程序,要求能计算带括号和负数的四则运算。
时间: 2024-02-11 14:06:10 浏览: 38
好的,我可以为您提供一份简易的计算器程序,以下是代码及说明:
```c
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#define MAX_EXPR_LEN 100
// 运算符栈
char op_stack[MAX_EXPR_LEN];
// 数字栈
double num_stack[MAX_EXPR_LEN];
// 运算符栈和数字栈的栈顶指针
int op_top = -1, num_top = -1;
// 将运算符压入运算符栈
void push_op(char op) {
op_stack[++op_top] = op;
}
// 将数字压入数字栈
void push_num(double num) {
num_stack[++num_top] = num;
}
// 弹出运算符栈的栈顶元素
char pop_op() {
return op_stack[op_top--];
}
// 弹出数字栈的栈顶元素
double pop_num() {
return num_stack[num_top--];
}
// 获取当前栈顶运算符,不存在返回'\0'
char peek_op() {
return op_top >= 0 ? op_stack[op_top] : '\0';
}
// 获取当前栈顶数字,不存在返回0
double peek_num() {
return num_top >= 0 ? num_stack[num_top] : 0;
}
// 判断是否为运算符,是返回1,否则返回0
int is_op(char c) {
return c == '+' || c == '-' || c == '*' || c == '/';
}
// 获取运算符的优先级,数字越大优先级越高
int op_priority(char op) {
if (op == '+' || op == '-') {
return 1;
} else if (op == '*' || op == '/') {
return 2;
} else {
return 0;
}
}
// 计算表达式
double calculate(double left, double right, char op) {
switch (op) {
case '+': return left + right;
case '-': return left - right;
case '*': return left * right;
case '/': return left / right;
default: return 0;
}
}
// 计算表达式,返回结果
double eval(char *expr) {
char *ptr = expr;
double num = 0;
int is_negative = 0, in_decimal = 0, decimal_pos = 0;
while (*ptr != '\0') {
if (isspace(*ptr)) {
// 忽略空格
ptr++;
} else if (isdigit(*ptr)) {
// 处理数字
num = num * 10 + (*ptr - '0');
if (in_decimal) {
decimal_pos++;
}
ptr++;
} else if (*ptr == '.') {
// 处理小数点
in_decimal = 1;
ptr++;
} else if (*ptr == '-') {
// 处理负数
if (ptr == expr || is_op(*(ptr - 1)) || *(ptr - 1) == '(') {
is_negative = 1;
} else {
push_op(*ptr);
}
ptr++;
} else if (is_op(*ptr)) {
// 处理运算符
while (op_top >= 0 && op_priority(*ptr) <= op_priority(peek_op())) {
double right_num = pop_num();
double left_num = pop_num();
char op = pop_op();
push_num(calculate(left_num, right_num, op));
}
push_op(*ptr);
ptr++;
} else if (*ptr == '(') {
// 处理左括号
push_op(*ptr);
ptr++;
} else if (*ptr == ')') {
// 处理右括号
while (op_top >= 0 && peek_op() != '(') {
double right_num = pop_num();
double left_num = pop_num();
char op = pop_op();
push_num(calculate(left_num, right_num, op));
}
if (op_top >= 0 && peek_op() == '(') {
pop_op();
}
ptr++;
} else {
// 非法字符
return 0;
}
}
// 处理最后一个数字
if (in_decimal) {
num /= pow(10, decimal_pos);
}
if (is_negative) {
num = -num;
}
push_num(num);
// 计算剩余的表达式
while (op_top >= 0) {
double right_num = pop_num();
double left_num = pop_num();
char op = pop_op();
push_num(calculate(left_num, right_num, op));
}
return peek_num();
}
int main() {
char expr[MAX_EXPR_LEN];
printf("请输入表达式:");
scanf("%s", expr);
double result = eval(expr);
printf("计算结果:%f\n", result);
return 0;
}
```
该程序基于栈实现了一个简单的表达式求值器,支持带括号和负数的四则运算。主要思路是读取表达式中的每一个字符,如果是数字则将其转换成数字并压入数字栈,如果是运算符则将其压入运算符栈,如果是左括号则将其压入运算符栈,如果是右括号则不断弹出运算符栈中的运算符和数字栈中的数字直到遇到左括号为止并将左括号弹出,最后计算剩余的表达式。
由于C语言没有内置的pow函数,因此在处理小数时需要手动计算小数点后的位数。如果表达式中包含非法字符,则计算结果会返回0。
请注意,此程序仅为演示用途,可能存在一些问题和不足,如对于大数的处理、错误输入的处理等。