c语言实现一个简易计算器,输入为不定长的包含整形数字和运算符的算式,算式中只包含加减操作,当输入等号时表示输入完成,输出结果
时间: 2024-11-06 08:16:06 浏览: 4
在C语言中实现一个简易计算器可以采用栈数据结构来处理运算过程。下面是一个基本的示例,这个程序会读取用户输入的算术表达式,并计算出结果:
```c
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#define MAX_TOKEN_LEN 50
// 定义运算符优先级
enum OpPriority { NUM = 0, ADD = 1, SUB = 2 };
// 结构体表示栈中的元素
typedef struct {
char op; // 运算符
int num; // 整数
enum OpPriority pri;
} Token;
// 函数用于将字符串分割成令牌并推入栈
void tokenize(char *expr, Token stack[], int &top) {
char token[MAX_TOKEN_LEN];
while (*expr != '\0') {
if (isdigit(*expr)) {
int start = expr - token;
while (isdigit(*(++expr))) {
token[start++] = *expr;
}
token[start] = '\0';
stack[top++] = (Token){.num = atoi(token), .pri = NUM};
} else if (*expr == '+' || *expr == '-') {
stack[top++] = (Token){*expr++, .pri = ADD - (*expr == '-')};
}
}
}
// 计算栈顶两个元素的运算结果并弹出栈
double calculate(Token top[]) {
double num1 = top[-2].num, num2 = top[-1].num;
switch (top[-1].op) {
case '+':
return num1 + num2;
case '-':
return num1 - num2;
}
return 0; // 如果不是有效的运算符,返回0
}
int main() {
Token stack[100];
int top = 0;
char input[100];
while (fgets(input, sizeof(input), stdin)) {
if (input[0] == '=') break; // 等号表示结束输入
tokenize(input, stack, top);
// 执行运算直到遇到等号
while (top > 1) {
top -= 2;
printf("%lf ", calculate(stack));
}
// 处理最后一个未匹配的运算符或数字
if (top > 0 && stack[top].pri != NUM) {
printf("%lf", calculate(stack + top));
}
top--; // 移除最后一个剩余的元素
}
printf("\n");
return 0;
}
```
在这个例子中,`tokenize`函数负责解析输入的字符串,`calculate`函数则根据栈顶元素执行计算。注意,这是一个简化的版本,没有处理错误边界,例如空输入、非法字符、括号等问题。实际应用中,你需要添加适当的错误检查。
阅读全文