用C语言设计复杂计算器的代码
时间: 2023-12-08 17:04:20 浏览: 320
c语言计算器设计代码
3星 · 编辑精心推荐
以下是一个简单的命令行复杂计算器示例代码,实现了加减乘除、幂运算、括号和优先级等功能:
```c
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
// 定义符号常量
#define ADD '+'
#define SUB '-'
#define MUL '*'
#define DIV '/'
#define POW '^'
#define LEFT_BRACKET '('
#define RIGHT_BRACKET ')'
// 定义运算符优先级
int get_priority(char op) {
switch (op) {
case LEFT_BRACKET:
return 1;
case ADD:
case SUB:
return 2;
case MUL:
case DIV:
return 3;
case POW:
return 4;
default:
return 0;
}
}
// 计算两个数的运算结果
double calculate(double num1, double num2, char op) {
switch (op) {
case ADD:
return num1 + num2;
case SUB:
return num1 - num2;
case MUL:
return num1 * num2;
case DIV:
return num1 / num2;
case POW:
return pow(num1, num2);
default:
return 0;
}
}
// 中缀表达式转后缀表达式
void infix_to_postfix(char *infix, char *postfix) {
int i = 0, j = 0;
char stack[100], ch;
while ((ch = infix[i++]) != '\0') {
if (ch >= '0' && ch <= '9') { // 数字直接输出
postfix[j++] = ch;
} else if (ch == LEFT_BRACKET) { // 左括号入栈
stack[++stack[0]] = ch;
} else if (ch == RIGHT_BRACKET) { // 右括号弹出栈内元素直到遇到左括号
while (stack[stack[0]] != LEFT_BRACKET) {
postfix[j++] = stack[stack[0]--];
}
stack[0]--;
} else { // 运算符弹出并输出优先级大于等于当前运算符的栈内元素
while (stack[0] > 0 && get_priority(stack[stack[0]]) >= get_priority(ch)) {
postfix[j++] = stack[stack[0]--];
}
stack[++stack[0]] = ch;
}
}
// 弹出栈内剩余元素
while (stack[0] > 0) {
postfix[j++] = stack[stack[0]--];
}
postfix[j] = '\0';
}
// 计算后缀表达式的值
double evaluate_postfix(char *postfix) {
int i = 0;
char stack[100], ch;
double num1, num2;
while ((ch = postfix[i++]) != '\0') {
if (ch >= '0' && ch <= '9') { // 数字入栈
stack[++stack[0]] = ch - '0';
} else { // 运算符弹出栈内两个元素进行运算
num2 = stack[stack[0]--];
num1 = stack[stack[0]--];
stack[++stack[0]] = calculate(num1, num2, ch);
}
}
return stack[1];
}
int main() {
char infix[100], postfix[100];
printf("请输入中缀表达式:");
scanf("%s", infix);
infix_to_postfix(infix, postfix);
printf("后缀表达式为:%s\n", postfix);
printf("计算结果为:%lf\n", evaluate_postfix(postfix));
return 0;
}
```
该计算器的实现基于经典的“中缀表达式转后缀表达式”算法和后缀表达式求值算法,具有一定的扩展性和灵活性,可以根据具体需求进行修改和扩展。同时,需要注意的是该计算器的输入和输出均为字符串类型,需要进行适当的类型转换和错误处理。
阅读全文