用C语言设计一个简单的计算器,要求能够对输入的数 1.进行+,-,*,/,运算;2.可以带括号( );3.不限定运算式的输入长度.
时间: 2024-03-29 16:41:49 浏览: 81
好的,下面是一个简单的计算器程序:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAXLEN 100
typedef struct {
int value;
char op;
} token_t;
int get_token(char *input, int *index, token_t *token) {
int num = 0, sign = 1;
while (input[*index] >= '0' && input[*index] <= '9') {
num = num * 10 + input[*index] - '0';
++(*index);
}
if (input[*index] == '+' || input[*index] == '-' || input[*index] == '*' || input[*index] == '/') {
token->op = input[*index];
token->value = num;
++(*index);
return 1;
} else if (input[*index] == '(') {
token->op = '(';
++(*index);
return 1;
} else if (input[*index] == ')') {
token->op = ')';
++(*index);
return 1;
} else if (input[*index] == '\0') {
token->value = num;
return 0;
} else {
printf("Invalid character: %c\n", input[*index]);
exit(1);
}
}
int eval_expr(char *input, int *index, int prec) {
token_t token;
int left, right;
int value;
get_token(input, index, &token);
if (token.op == '(') {
value = eval_expr(input, index, 0);
get_token(input, index, &token);
} else {
value = token.value;
}
while (token.op != '\0' && token.op != ')') {
if (get_token(input, index, &token) == 0) {
return value;
}
if (token.op == '+' || token.op == '-') {
if (prec < 1) {
left = value;
right = eval_expr(input, index, 1);
if (token.op == '+') {
value = left + right;
} else {
value = left - right;
}
}
} else {
left = value;
if (get_token(input, index, &token) == 0) {
printf("Unexpected end of input\n");
exit(1);
}
if (token.op == '(') {
right = eval_expr(input, index, 0);
get_token(input, index, &token);
} else {
right = token.value;
}
if (token.op == '*') {
value = left * right;
} else if (token.op == '/') {
value = left / right;
} else {
printf("Invalid operator: %c\n", token.op);
exit(1);
}
}
}
return value;
}
int main() {
char input[MAXLEN];
int index = 0;
printf("Enter an expression: ");
fgets(input, MAXLEN, stdin);
printf("Result: %d\n", eval_expr(input, &index, 0));
return 0;
}
```
这个程序的基本思路是,先将输入的字符串分割成一个一个的 token,然后按照优先级进行递归求值。具体来说,get_token 函数用于获取一个 token,它会从输入的字符串中读取数字或运算符,然后返回一个 token 结构体,表示这个数或运算符。eval_expr 函数用于计算一个表达式的值,它会不断调用 get_token 函数来获取 token,并根据运算符的优先级进行递归计算。如果遇到括号,就会递归计算括号内的表达式。最终返回结果。
这个程序可以处理任意长度的表达式,并支持加减乘除和括号。不过它还有一些局限性,比如不支持小数和负数。如果需要支持这些功能,就需要对程序进行扩展。
阅读全文